我正在为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