Добавить элементы из IList в ObservableCollection
У меня есть ObservableCollection, и я хотел бы установить содержимое IList для этого. Теперь я мог бы просто создать новый экземпляр коллекции..:
public ObservableCollection<Bar> obs = new ObservableCollection<Bar>();
public void Foo(IList<Bar> list)
{
obs = new ObservableCollection<Bar>(list);
}
Но как я могу взять контент IList и добавить его в мой существующий ObservableCollection? Нужно ли мне перебирать все элементы, или есть лучший способ?
public void Foo(IList<Bar> list)
{
foreach (var elm in list)
obs.Add(elm);
}
Ответы
Ответ 1
Вы могли бы сделать
public void Foo(IList<Bar> list)
{
list.ToList().ForEach(obs.Add);
}
или как метод расширения,
public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items)
{
items.ToList().ForEach(collection.Add);
}
Ответ 2
Вы можете написать свой собственный метод расширения, если используете С# 3 +, чтобы помочь вам в этом. У этого кода было некоторое базовое тестирование, чтобы убедиться, что он работает:
public static void AddRange<T>(this ObservableCollection<T> coll, IEnumerable<T> items)
{
foreach (var item in items)
{
coll.Add(item);
}
}
Ответ 3
Цикл - единственный способ, поскольку для ObservableCollection
нет эквивалента AddRange
.
Ответ 4
Вот потомок к ObservableCollection<T>
, чтобы добавить эффективное сообщение AddRange
, плюс модульные тесты:
ObservableCollection Не поддерживает метод AddRange, поэтому я получаю уведомление для каждого добавленного элемента, помимо того, что касается INotifyCollectionChanging?
Ответ 5
Есть библиотека, которая решает эту проблему. Он содержит ObservableList, который может обернуть список. Его можно использовать следующим образом:
List<Bar> currentList = getMyList();
var obvList = new ObservableList<Bar>(currentList);
https://github.com/gsonnenf/Gstc.Collections.ObservableLists