ObservableCollection <>与List <>

我有很多与每个嵌套List<>的实体。

例如,我拥有List<ColumnEntity> BaseEntityColumnEntity类具有List<Info>等。

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

什么是利弊将所有这些嵌套的Lists更改为ObservableCollections ? 那么我们可以跟踪BaseEntity所有更改,而不必将每个BaseEntity列表重新分配给修改的绑定ObservableCollection

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

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

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

另外,我不会使用ObservableCollection ,因为我知道我不会绑定这些地方,所以重要的是要仔细检查你的devise,并确保你正在采取正确的方法分离关注层。

至于Collection<T>List<T>之间的区别,你可以看看这里generics列表vs集合

这取决于你的意思是:

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

跟踪已经在列表中的对象的变化足够了吗? 或者你需要知道什么时候从列表中删除/添加/更改列表中的对象?

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

所以,虽然差异可能是有趣的(和以前的海报已经涵盖了这些),通常你不会有这么多的select – 无论你需要ObservableCollection<T>或你不这样做。

List表示可以通过索引访问的对象的强types列表。 它提供了search,sorting和操作列表的方法。 List类是ArrayList类的通用等价物。 它使用大小根据需要dynamic增加的数组实现IList通用接口。

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

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

我觉得没有什么问题,除了一个非常边际的性能开销。

请注意,如果您直接修改内部列表,则不会收到有关更改的通知。 此外,如果包含在ObservableCollection中的对象被修改,则不会通知您。 只有在元素被添加,replace,移除或移动的情况下,通知才会发生。

一个更重要的区别是你只能从创build它的线程访问ObservableCollection,因为列表可以从fromany线程访问。