添加到BindableCollection的更好解决方案似乎非常慢,添加了1000多个对象。除非我遗漏了什么。
答案 0 :(得分:4)
我认为AddRange缓慢的原因是许多NotifyOnPropertyChanged事件都被触发了。 Caliburn本身在添加范围时不会引发事件,但是BindableColletion会调用它的基础ObservableCollection.InsertItem,它会在每个Item上触发OnPropertyChanged和OnCollectionChanged。 将BindableColletion复制到临时列表<>,将Long列表添加到它并创建新的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
使用临时列表&lt;&gt;:00:00:00.1750151
的时间