ObservableCollection <> vs. List <> - PullRequest
       0

ObservableCollection <> vs. List <>

68 голосов
/ 16 ноября 2010

У меня много сущностей с вложенным List<> в каждом.

Например, у меня есть BaseEntity, который имеет List<ColumnEntity>. ColumnEntity класс имеет List<Info> и т. Д.

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

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

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

Ответы [ 5 ]

78 голосов
/ 16 ноября 2010

Интересный вопрос, учитывая, что и List, и ObservableCollection реализуют IList<T>, здесь нет большой разницы, ObservableCollection также реализует интерфейс INotifyCollectionChanged, который позволяет WPF связываться с ним.

Одним из основных отличий является то, что ObservableCollection не имеет AddRange метода, который может иметь некоторые последствия.

Также я бы не использовал ObservableCollection для мест, где я знаю, что яне будет обязательным, по этой причине важно пересмотреть свой дизайн и убедиться, что вы используете правильный подход в разделении проблемных слоев.

Что касается различий между Collection<T> и List<T> Вы можете посмотреть здесь Общие списки против коллекции

29 голосов
/ 16 ноября 2010

Это зависит от того, что именно вы подразумеваете под этим:

нам нужно отслеживать все изменения в каждом списке BaseEntity

Достаточно ли будет отслеживать изменения объектов, уже находящихся в списке? Или вам нужно знать, когда объекты удаляются из / добавляются / меняются позиции в списке?

Если список будет содержать одни и те же элементы в течение всего времени их жизни, но отдельные объекты в этом списке будут меняться, то достаточно, чтобы только объекты вызывали уведомления об изменениях (обычно через INotifyPropertyChanged), и достаточно List<T> , Но если список будет время от времени содержать разные объекты, или если порядок меняется, то вам следует использовать ObservableCollection<T>.

Так что, хотя различия могут быть интересными (и предыдущий плакат уже охватывал их), как правило, у вас не будет такого большого выбора - либо вам нужен ObservableCollection<T>, либо нет.

9 голосов
/ 26 июня 2013

Список представляет строго типизированный список объектов, к которым можно получить доступ по индексу.Он предоставляет методы для поиска, сортировки и управления списками.Класс List является универсальным эквивалентом класса ArrayList.Он реализует универсальный интерфейс IList, используя массив, размер которого динамически увеличивается по мере необходимости.

ObservableCollection - это универсальный динамический сбор данных, который использует интерфейс INotifyCollectionChanged для предоставления уведомлений при добавлении, удалении элементов или когдався коллекция обновляется.

Подробнее об этом можно узнать по этой ссылке: http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha

7 голосов
/ 17 февраля 2016

Еще одним важным отличием является то, что вы можете получить доступ к ObservableCollection только из потока, в котором он был создан, где в качестве списка можно получить доступ из любого потока.

5 голосов
/ 16 ноября 2010

Я не вижу никаких проблем с этим, за исключением очень незначительного снижения производительности.

Обратите внимание, что при непосредственном изменении внутренних списков вы не будете уведомлены об изменениях. Также, если объекты, содержащиеся в ObservableCollection, изменены, вы не будете уведомлены. Уведомление происходит только в том случае, если элементы добавлены, заменены, удалены или перемещены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...