我正在为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(),它不具备该类的内部知识。您可以使用ildasm.exe来确定正在发生的事情。

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

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

10-08 12:05