Лучшая производительность для 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, чтобы получить подробную информацию.

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

Другие вопросы по тегам