ObservableCollection.AddRange的最佳性能

Cha*_*s W 4 c# extension-methods observablecollection mvvm 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); }
}
Run Code Online (Sandbox Code Playgroud)

还有其他解决方案吗?

Mic*_*ook 6

鉴于这Concat<T>是一种扩展方法,它几乎肯定只是.Add()在封面下调用,它不具备该类的内部知识.你可以使用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

  • 这看起来像另一个很好的解决方案:http://stackoverflow.com/questions/670577/observablecollection-doesnt-support-addrange-method-so-i-get-notified-for-each (4认同)