添加到 BindableCollection 的更好解决方案,在添加超过 1000 个对象时似乎非常慢。除非我错过了什么。
最佳答案
我认为 AddRange 缓慢的原因是触发了许多 NotifyOnPropertyChanged 事件。 Caliburn 本身在添加范围时不会引发事件,但 BindableCollection 调用其基础 ObservableCollection.InsertItem,进而在每个 Item 上触发 OnPropertyChanged 和 OnCollectionChanged。 将 BindableCollection 复制到临时 List<>,将长列表添加到其中并创建新的 BindableCollection(临时)似乎更快。
我写了一个简短的基准测试。 请注意,此示例中的 BindableCollection 实际上未绑定(bind)任何内容,因此在现实场景中,好处应该更大。
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
使用临时列表的时间<>:00:00:00.1750151
关于caliburn.micro - BindableCollection<> AddRange 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22990250/