为什么ObservableCollection没有RemoveAll方法?

16

为什么ObservableCollection没有像List一样拥有RemoveAll方法?

我已经实现了一个扩展方法来为ObservableCollection提供这个功能,但我想知道是否有特定的原因不提供这个功能。

这可能会影响数据绑定吗,因为集合变化这篇文章确实指出了在使用ObservableCollections时可能出现的一些问题,但并没有回答这个问题。


1
你看过Clear()方法吗?(http://msdn.microsoft.com/en-us/library/ms132405.aspx) - Eirik
它具有Clear()方法,可以从集合中删除所有元素。 - Dante
2
好的,RemoveAll()方法并不是用来清空集合的。即使List有一个Clear()方法。它的目的是删除所有符合特定条件的项目。 - Shakti Prakash Singh
1
对于任何的“踩”,请说明原因。 - Shakti Prakash Singh
这是没有意义的,因为ObservableCollection实现了iList接口。 - paparazzo
2
@Blam:RemoveAll 不是接口的一部分。 - H.B.
2个回答

32

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

如果我猜测为什么他们使用 Clear 而不是 RemoveAll,我想这是因为RemoveAll会暗示您正在从集合中删除项目,而Clear则告诉您这些项目被清除了。

这会影响到引发的 CollectionChanged 通知类型。 Clear() 引发一个 NotifyCollectionChangedAction.Reset 事件,并且不包括在事件中删除的项,而 Remove 引发一个 NotifyCollectionChangedAction.Removed 事件,并将已删除的项传递给该事件。

您无法引发具有多个项的 CollectionChanged 事件,因此使用NotifyCollectionChangedAction.Removed 事件引发所有已删除项目将抛出异常。另一种选择是为每个删除的项目引发一个 CollectionChanged 事件,但这可能会对性能造成很大的负载。简单地引发一个 NotifyCollectionChangedAction.Reset 事件会导致用户在删除项目时期望发生 Removed 事件而感到困惑。

因此,我猜他们决定仅使用.Clear() 而不是 .RemoveAll(),因为名称更好地描述了实际发生的情况。


我认为这解释得很清楚了。感谢您提供如此详细的解释。 - Shakti Prakash Singh

0
你可以问为什么它不实现Reverse或任何其他方法。没有理由实现超过最常见和绝对必要的方法。除了AddRemove之外的所有内容都只是方便之举。(RemoveAll甚至不是列表实现的常见接口的一部分,而它们已经有很多方法了)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接