Лучшая производительность для ObservableCollection.AddRange
Я пишу метод расширения для 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); }
}
Есть ли другие решения для этого?
1 ответ
При условии Concat<T>
это метод расширения, это почти наверняка просто вызов .Add()
под одеялом у него не может быть внутренних знаний о классе. Вы можете использовать ildasm.exe, чтобы увидеть, что происходит наверняка.
Я столкнулся с проблемами производительности для этого самого случая, используя ObervableCollection<T>
пару лет назад. Решение, к которому я пришел, заключалось в реализации IList<T>
а также INotifyCollectionChanged
с пользовательской реализацией, которая поддерживает создание одного события CollectionChanged с фактической дельтой коллекции (вместо событий для каждого элемента) в ответ на вызов AddRange<T>
, Проверьте документацию для NotifyCollectionChangedEventArgs, чтобы получить подробную информацию.