我有很多实体,每个实体都有嵌套List<>
。
例如,我BaseEntity
有List<ColumnEntity>
。
ColumnEntity
班级有List<Info>
等等。
我们正在使用WPF用户界面,我们需要跟踪每个BaseEntity
列表中的所有更改。它是通过基于所需列表实例化new ObservableCollection
并绑定到ObservableCollection
来实现的。
将所有这些嵌套Lists
更改为ObservableCollections
的优缺点是什么?因此,我们可以跟踪BaseEntity
本身的所有更改,而无需将每个BaseEntity
列表重新分配给已修改的绑定ObservableCollection
?
假设从不使用特定于List
的方法。
答案 0 :(得分:76)
有趣的问题,考虑到List和ObservableCollection
实现IList<T>
并没有太大区别,ObservableCollection
也实现了INotifyCollectionChanged
接口,这允许WPF绑定它。
其中一个主要区别是ObservableCollection
没有AddRange
方法,这可能会产生一些影响。
此外,我不会将ObservableCollection
用于我知道我不会约束的地方,因此重要的是要重新审视您的设计并确保您采取正确的方法来分离层关注。
就Collection<T>
和List<T>
之间的差异而言,您可以查看此处
Generic Lists vs Collection
答案 1 :(得分:29)
这完全取决于你的意思:
我们需要跟踪每个BaseEntity列表中的所有更改
跟踪列表中已有对象的更改是否足够?或者您是否需要知道何时从列表中删除/添加对象/更改位置?
如果列表在其整个生命周期中将包含相同的项目,但该列表中的各个对象将发生更改,那么只需对象引发更改通知(通常通过INotifyPropertyChanged
)和{{1 }} 足够了。但如果列表不时包含不同的对象,或者订单发生变化,那么您应该使用List<T>
。
因此,尽管差异可能很有趣(以前的海报已经涵盖了这些差异),但通常情况下你没有那么多的选择 - 要么你需要ObservableCollection<T>
要么你不需要。
答案 2 :(得分:9)
List表示可以通过索引访问的强类型对象列表。它提供了搜索,排序和操作列表的方法。 List类是ArrayList类的通用等价物。它使用一个数组来实现IList泛型接口,该数组的大小根据需要动态增加。
ObservableCollection是一个通用动态数据集合,它使用接口“INotifyCollectionChanged”在项目被添加,删除或刷新整个集合时提供通知。
在此链接中了解有关它的更多信息:http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha
答案 3 :(得分:7)
另一个重要的区别是,您只能从创建它的线程访问ObservableCollection,其中列表可以通过线程访问。
答案 4 :(得分:5)
除了非常微小的性能开销之外,我认为没有问题。
请注意,如果直接修改内部列表,则不会通知您有关更改的信息。此外,如果修改了ObservableCollection中包含的对象,则不会通知您。只有在添加,替换,删除或移动元素时才会发生通知。