ObservableCollection <>与List <>
我有很多与每个嵌套List<>
的实体。
例如,我拥有List<ColumnEntity>
BaseEntity
。 ColumnEntity
类具有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线程访问。