ObservableCollection <> vs. List <>
У меня есть много объектов с вложенными List<>
в каждом.
Например, у меня есть BaseEntity
, у которого есть List<ColumnEntity>
.
ColumnEntity
имеет List<Info>
и т.д.
Мы работаем с WPF, и нам нужно отслеживать все изменения в каждом списке BaseEntity
. Он реализуется путем создания экземпляра new ObservableCollection
на основе нужного списка и привязки к нему ObservableCollection
.
Какие плюсы и минусы меняют все эти вложенные Lists
на ObservableCollections
? Таким образом, мы можем отслеживать все изменения в BaseEntity
самостоятельно, не переназначая каждый список BaseEntity
до измененной привязки ObservableCollection
?
Предполагая, что методы, специфичные для List
, никогда не используются.
Ответы
Ответ 1
Интересный вопрос, учитывая, что как List, так и ObservableCollection
реализуют IList<T>
, там не так много различий, ObservableCollection
также реализует интерфейс INotifyCollectionChanged
, который позволяет WPF привязываться к нему.
Одно из главных отличий заключается в том, что ObservableCollection
не имеет метода AddRange
, который может иметь некоторые последствия.
Также я бы не использовал ObservableCollection
для тех мест, где я знаю, что я не буду привязываться к ним, поэтому важно пересмотреть свой дизайн и убедиться, что вы применяете правильный подход при разделении слоев, вызывающих озабоченность.
Что касается различий между Collection<T>
и List<T>
, вы можете посмотреть здесь
Общие списки против коллекции
Ответ 2
Это зависит от того, что вы подразумеваете под этим:
нам нужно отслеживать все изменения в каждом списке BaseEntity
Достаточно ли отслеживать изменения объектов, которые уже есть в списке? Или вам нужно знать, когда объекты удаляются из/добавляются в/изменять позиции в списке?
Если список будет содержать одни и те же элементы для всего их жизненного цикла, но отдельные объекты в этом списке будут изменены, то достаточно только для того, чтобы объекты, чтобы поднимать уведомления об изменениях (обычно через INotifyPropertyChanged
) и List<T>
, являются достаточными, Но если список будет содержать разные объекты время от времени, или если заказ изменится, вы должны использовать ObservableCollection<T>
.
Итак, хотя различия могут быть интересными (и предыдущий плакат уже осветил их), обычно у вас не будет такого выбора - вам нужно ObservableCollection<T>
, или вы этого не сделаете.
Ответ 3
Список представляет собой строго типизированный список объектов, к которым можно получить доступ по индексу. Он предоставляет методы для поиска, сортировки и манипулирования списками. Класс List является общим эквивалентом класса ArrayList. Он реализует общий интерфейс IList, используя массив, размер которого динамически увеличивается по мере необходимости.
ObservableCollection - это общий динамический набор данных, который использует интерфейс "INotifyCollectionChanged" для предоставления уведомлений, когда элементы добавляются, удаляются или когда вся коллекция обновляется.
Подробнее об этом в этой ссылке: http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha
Ответ 4
Я не вижу проблем с этим, кроме очень незначительных издержек производительности.
Обратите внимание: если вы изменяете внутренние списки напрямую, вы не будете уведомлены об изменениях. Также, если объекты, содержащиеся в ObservableCollection, изменены, вы не будете уведомлены. Уведомление происходит только, если элементы добавляются, заменяются, удаляются или перемещаются.
Ответ 5
Еще одно важное отличие состоит в том, что вы можете получить доступ к ObservableCollection только из потока, на котором он был создан, где в качестве списка можно получить доступ из любого потока.