添加到BindableCollection的更好的解决方案,似乎真的很慢,超过1000个对象被添加。除非我错过了什么。
发布于 2014-04-19 19:56:06
我认为AddRange慢的原因是很多NotifyOnPropertyChanged事件都被触发了。杯标本身不会在添加范围时引发事件,但BindableColletion调用它的基ObservableCollection.InsertItem,这反过来会对每个项触发OnPropertyChanged和OnCollectionChanged。将BindableColletion复制到临时List<>,将长列表复制到它并创建一个新的BindableCollection(临时)似乎更快。
我写了一个短期基准。注意,本例中的BindableCollection实际上没有绑定到任何东西,因此在现实世界中,好处应该更大。
private static void Main()
{
DateTime startTime;
TimeSpan elapsedTime;
var longList = new List<int>(Enumerable.Range(1, 10000000));
var bindableInts = new BindableCollection<int>(Enumerable.Range(1, 100));
startTime = DateTime.Now;
bindableInts.AddRange(longList);
elapsedTime = DateTime.Now - startTime;
Console.WriteLine("Time using AddRange: " + elapsedTime);
bindableInts = new BindableCollection<int>(Enumerable.Range(1, 100));
startTime = DateTime.Now;
var temp = new List<int>(bindableInts);
temp.AddRange(longList);
bindableInts = new BindableCollection<int>(temp);
elapsedTime = DateTime.Now - startTime;
Console.WriteLine("Time using `temp List<>`: " + elapsedTime);
Console.ReadLine();
}输出:
使用AddRange: 00:00:00.7310548的时间
使用临时List<>:00:00:00.1750151的时间
https://stackoverflow.com/questions/22990250
复制相似问题