ObservableCollection против списка


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

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

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

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

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

5 64

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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