caliburn.micro - BindableCollection<> AddRange 慢

标签 caliburn.micro

添加到 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/

相关文章:

xamarin.forms - 使用 Caliburn.Micro 删除 Xamarin Forms 应用程序上的导航栏

c# - 使用 Message.Attach 时 Caliburn.Micro 和/或 WindowsBase 中出现 NullReferenceException

c# - 使用 CaliburnMicro 在 HubPage 中绑定(bind) ViewModel

caliburn.micro - 带有 Caliburn Micro 2 和 Windows Phone 8.1 的 NavigateToViewModel

c# - 使用 Caliburn.Micro 绑定(bind)到深层属性的组合框

wpf - 将 Caliburn Micro Screen(UserControl) 添加到 WPF MVVM 中的 Canvas ?

c# - 为什么 caliburn.Micro 解释不起作用?

c# - 在 Caliburn.micro 中设置初始窗口大小

silverlight - 如何将 ValueConverter 应用于基于约定的 Caliburn.Micro 绑定(bind)?

Silverlight 绑定(bind)值错误