ObservableCollection <>与List <>

And*_*zym 72 .net c# wpf

我有很多嵌套List<>在每个实体的实体.

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

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

改变所有这些嵌套的优缺点ListsObservableCollections什么?那么我们可以BaseEntity自己跟踪所有变化而无需重新分配每个BaseEntity修改边界的列表ObservableCollection

假设List从不使用特定于的方法.

Sta*_* R. 84

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

其中一个主要区别是ObservableCollection没有AddRange方法,可能会产生一些影响.

此外,我不会ObservableCollection用于我知道我不会约束的地方,因此重要的是要重新审视你的设计并确保你采取正确的方法来分离关注层.

至于之间的差异Collection<T>,并List<T>可以在这里看看 泛型列表VS系列

  • 我修复了链接,更改已获得批准。 (2认同)

Ian*_*ths 29

这取决于你的意思:

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

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

如果列表在其整个生命周期中将包含相同的项目,但该列表中的各个对象将发生更改,那么只需对象引发更改通知(通常是通过INotifyPropertyChanged)List<T>就足够了.但如果列表中不时会包含不同的对象,或者订单发生变化,那么您应该使用ObservableCollection<T>.

因此,虽然差异可能很有趣(并且之前的海报已经涵盖了这些差异),但通常您不会有太多选择 - 您需要ObservableCollection<T>或不需要.

  • 很好地想到了.+1 (3认同)

小智 9

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

ObservableCollection是一个通用动态数据集合,它使用接口"INotifyCollectionChanged"在添加,删除项目或刷新整个集合时提供通知.

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


小智 7

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

  • 不真实。您可以从任何线程访问两者。但是,当 ObservableCollection 绑定到 ItemsControl 时,如果从非图形线程触发更改,它将从非图形线程修改图形对象。并且是禁止的-&gt;例外 (2认同)

cod*_*nix 5

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

请注意,如果直接修改内部列表,则不会通知您有关更改的信息.此外,如果修改了ObservableCollection中包含的对象,则不会通知您.如果添加,替换,删除或移动元素,则仅发生通知.