2012-07-27 79 views
9

为什么ObservableCollection没有RemoveAll方法like List为什么ObservableCollection没有RemoveAll方法?

我已经实现了扩展方法来提供这种功能的ObservableCollection,但我想了解是否有不提供这种功能的具体原因。

会不会影响数据绑定由于收藏变更This后确实指定了几个可能会出错,但使用ObservableCollections,但没有解决这个问题。

+1

你看过Clear()方法吗? (http://msdn.microsoft.com/en-us/library/ms132405.aspx) – Eirik 2012-07-27 13:44:02

+0

它有方法Clear(),它从集合中删除所有元素。 – Dante 2012-07-27 13:44:52

+1

那么,RemoveAll()方法不是为了清除集合。即使列表有一个Clear()方法。它旨在删除符合特定条件的所有项目。 – 2012-07-27 13:48:07

回答

17

它确实有一个Clear()方法,它可以删除所有可替代使用的项目。

如果让我猜的话,为什么他们使用Clear代替RemoveAll,我觉得这是因为RemoveAll携带你是从集合删除项目的建议,同时Clear告诉你的项目只是被清除。

这使得CollectionChanged通知被引发的类型有所不同。 Clear()产生了一个NotifyCollectionChangedAction.Clear事件,并且不包括事件中的移除项目,而Remove产生了一个NotifyCollectionChangedAction.Removed事件,并将移除的项目传递给事件。

You cannot raise a CollectionChanged event with multiple items,因此如果在删除所有项目的情况下发生NotifyCollectionChangedAction.Removed事件将会引发异常。另一种方法是为每个删除的项目添加一个CollectionChanged事件,这对于性能可能非常不利。如果用户期望在移除项目时发生Removed事件,则简单地提起NotifyCollectionChangedAction.Reset事件会导致一些混淆。

所以我猜他们决定简单地使用.Clear()而不是.RemoveAll(),因为这个名字能够更好地描述幕后实际发生的事情。

+0

我认为这解释了它。感谢这样的详细解释。 – 2012-07-30 07:24:39

1

你可能会问为什么它不执行Reverse或任何其他方法。根本没有理由实施超过最常见和绝对必要的方法。除了AddRemove之外的所有内容都很方便。 (RemoveAll甚至不是列表工具的常用接口的一部分,而且它们的确有很多方法)

相关问题