c# - ObservableCollection.AddRange 的最佳性能

标签 c# mvvm extension-methods observablecollection inotifypropertychanged

我正在为 ObservableCollection 编写一个扩展方法,并且已了解到 .Add 函数每次调用都会引发 3 个属性更改事件,

所以这样的事情是一个坏主意:

public static void AddRange<T>(this ObservableCollection<T> oc, IEnumerable<T> collection)
{
    if (collection == null) { throw new ArgumentNullException("collection"); }
    foreach (var i in collection) { oc.Add(i); }
}

还有其他解决方案吗?

最佳答案

鉴于Concat<T>是一个扩展方法,几乎​​可以肯定它只是调用 .Add()在幕后,它不可能拥有类(class)的内部知识。您可以使用 ildasm.exe 来确定发生了什么。

在这种情况下,我使用 ObervableCollection<T> 遇到了性能问题。几年前。我最终得出的解决方案是实现 IList<T>INotifyCollectionChanged使用自定义实现,支持引发具有实际集合增量的单个 CollectionChanged 事件(而不是每个项目的事件),以响应对 AddRange<T> 的调用。查看 NotifyCollectionChangedEventArgs 的文档以获取详细信息。

http://msdn.microsoft.com/en-us/library/system.collections.specialized.notifycollectionchangedeventargs(v=vs.110).aspx

关于c# - ObservableCollection.AddRange 的最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22154291/

相关文章:

C#嵌套foreach循环优化

c# - 使用 C# 取消注释 XML 文件中已注释的节点

c# - 如何在 C# 中对 & "crop"字典列表进行排序

c# - 使用 Linq-To-Xml 时处理空引用

c# - ICollection/ICollection<T> 歧义问题

c# - .GetAwaiter() 和 ConfigureAwait() 的区别

c# - 如何在 ios unity 后台运行代码

wpf - TextBlock 触发器而不是使用转换器

wpf - 如何删除正在使用Datavisualization工具包dll的Wpf图表中的点

wpf - 触发命令时强制绑定(bind)更新