Подтвердить что ты не робот

ObservableCollection <> vs. List <>

У меня есть много объектов с вложенными List<> в каждом.

Например, у меня есть BaseEntity, у которого есть List<ColumnEntity>. ColumnEntity имеет List<Info> и т.д.

Мы работаем с WPF, и нам нужно отслеживать все изменения в каждом списке BaseEntity. Он реализуется путем создания экземпляра new ObservableCollection на основе нужного списка и привязки к нему ObservableCollection.

Какие плюсы и минусы меняют все эти вложенные Lists на ObservableCollections? Таким образом, мы можем отслеживать все изменения в BaseEntity самостоятельно, не переназначая каждый список BaseEntity до измененной привязки ObservableCollection?

Предполагая, что методы, специфичные для List, никогда не используются.

4b9b3361

Ответ 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 только из потока, на котором он был создан, где в качестве списка можно получить доступ из любого потока.