1

我正在寫的ObservableCollection的擴展方法,並已閱讀了。新增功能提高了3財產每次呼叫改變事件,最佳性能ObservableCollection.AddRange

所以這樣的事情是一個壞主意:

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); } 
} 

還有其他解決方案嗎?

+2

如果你想了解的表現,衡量它。 –

+1

'Concat'不修改'oc',所以第二種方法沒有意義。 – BartoszKP

+1

澄清@BartoszKP寫的是什麼'Concat'是一個linq方法,不會修改集合。它返回一個新的'IEnumerable ',它包含'oc'和'collection'。 – Peter

回答

4

鑑於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

+3

這看起來像另一個偉大的解決方案: http://stackoverflow.com/questions/670577/observablecollection-doesnt-support-addrange-method-so-i-get-notified-for-each –