Observer ableCollection < > vs. List < >

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

例如,我有 BaseEntity,它有 List<ColumnEntity>ColumnEntity类有 List<Info>等等。

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

把这些嵌套的 Lists改成 ObservableCollections有什么好处和坏处?那么我们可以跟踪 BaseEntity本身的所有变化,而不必将每个 BaseEntity列表重新分配给修改过的绑定 ObservableCollection

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

101199 次浏览

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

其中一个主要的区别是,ObservableCollection没有 AddRange方法,这可能有一些含义。

此外,我不会使用 ObservableCollection的地方,我知道我不会绑定到,因为这个原因,这是重要的,去检查您的设计,并确保您是采取正确的方法,在分离层的关注。

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

这取决于你到底是什么意思:

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

跟踪已经在列表中的对象的更改是否足够?还是需要知道对象何时从列表中的/被添加到/更改位置?

如果一个列表在它们的整个生命周期中包含相同的项,但是列表中的单个对象会发生变化,那么只要对象引发变更通知(通常通过 INotifyPropertyChanged)就足够了,而 List<T>就足够了。但是,如果列表将不时包含不同的对象,或者顺序发生变化,那么您应该使用 ObservableCollection<T>

因此,虽然这些差异可能是有趣的(以前的海报已经涵盖了这些) ,通常你不会有那么多的选择-要么你需要 ObservableCollection<T>,要么你不需要。

我认为这没有问题,除了一个非常边际的性能开销。

请注意,如果直接修改内部 List,则不会通知您更改。另外,如果观察器集合中包含的对象被修改,则不会通知您。只有在添加、替换、删除或移动元素时才会发出通知。

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

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

阅读更多关于它的链接: http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha

一个更重要的区别是,只能从创建它的线程访问 ObableCollection,而 as list 可以从多个线程访问。