ObservableCollection <>与List <>


78

我有很多实体,List<>每个实体都有嵌套。

例如,我有BaseEntity其中有List<ColumnEntity>ColumnEntity班级List<Info>等等。

我们正在使用WPF UI,我们需要跟踪的每个List中的所有更改BaseEntity。通过实例化new ObservableCollection所需列表并绑定到该列表来实现它ObservableCollection

更改所有嵌套嵌套的利弊ListsObservableCollections什么?因此,我们可以跟踪BaseEntity自身的所有更改,而无需将的每个列表重新分配BaseEntity给经过修改的bound ObservableCollection

假设List从未使用特定于此的方法。

Answers:


89

有趣的问题是,考虑到List和ObservableCollection实现IList<T>之间没有太大的区别,ObservableCollection还实现了INotifyCollectionChanged接口,该接口允许WPF绑定到它。

主要区别之一是ObservableCollection没有AddRange方法,这可能会带来一些影响。

同样,我不会ObservableCollection在我不愿意绑定的地方使用,因为这个原因,重要的是仔细检查您的设计,并确保您采用正确的方法来分离关注的层次。

至于两者之间的差异Collection<T>List<T>您可以在这里查看 通用列表与集合


2
我修复了链接,更改已获得批准。

35

这完全取决于您的意思:

我们需要跟踪每个BaseEntity列表中的所有更改

跟踪列表中已有对象的更改是否足够?还是您需要知道何时从列表中删除对象/将对象添加到列表中/更改位置?

如果列表在整个生命周期中都包含相同的项目,但是该列表中的单个对象将发生变化,那么仅这些对象发出更改通知就足够了(通常通过INotifyPropertyChanged),这就List<T>足够了。但是,如果列表会不时包含不同的对象,或者顺序发生变化,则应使用ObservableCollection<T>

因此,尽管差异可能很有趣(并且以前的海报已经涵盖了这些差异),但通常您不会有太多选择-无论您需要ObservableCollection<T>还是不需要。


3
好好考虑。+1
Subby 2013年

12

List表示可以通过索引访问的对象的强类型列表。它提供了搜索,排序和操作列表的方法。List类是ArrayList类的通用等效项。它使用数组实现IList通用接口,该数组的大小根据需要动态增加。

ObservableCollection是一个通用的动态数据集合,它使用接口“ INotifyCollectionChanged”在添加,删除或刷新整个集合时提供通知。

在此链接中阅读有关此内容的更多信息:http : //www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha


10

另一个重要的区别是,您只能从创建它的线程访问ObservableCollection,而从任何线程都可以访问列表。


1
不对 您可以从任何线程访问两者。但是,当ObservableCollection绑定到ItemsControl时,如果从非图形线程触发了更改,则它将从非图形线程修改图形对象。并且被禁止->例外
Emmanuel DURIN

6

除了非常小的性能开销外,我认为没有问题。

请注意,如果直接修改内部列表,则不会收到有关更改的通知。同样,如果ObservableCollection中包含的对象被修改,则不会通知您。仅当添加,替换,删除或移动元素时,才发生通知。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.