13

为什么ObservableCollection没有RemoveAll像 a 这样的方法List

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

由于Collection 更改,它可能会以某种方式影响Data Binding吗?这篇文章确实指定了一些在使用时可能出错的事情,但没有解决这个问题。ObservableCollections

4

2 回答 2

28

它确实有一种Clear()方法可以删除您可以使用的所有项目。

如果我不得不冒险猜测他们为什么使用Clear而不是RemoveAll,我认为这是因为RemoveAll暗示您正在从集合中删除项目,同时Clear告诉您这些项目只是被清除。

这会CollectionChanged导致引发的通知类型有所不同。Clear()引发NotifyCollectionChangedAction.Reset事件并且不包括事件中移除的项目,同时Remove引发NotifyCollectionChangedAction.Removed事件并将移除的项目传递给事件。

您不能引发CollectionChanged包含多个项目的事件,因此NotifyCollectionChangedAction.Removed在移除所有项目的情况下引发事件会引发异常。另一种方法是为每个被删除的项目引发一个CollectionChanged事件,这可能对性能非常不利。NotifyCollectionChangedAction.Reset当用户期望Removed在删除项目时发生事件时,简单地引发事件会导致一些混乱。

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

于 2012-07-27T15:20:46.067 回答
0

您不妨问为什么它没有实现Reverse或任何其他方法。除了最常见和绝对必要的方法之外,没有理由实施更多的方法。旁边的一切AddRemove只是方便。(RemoveAll甚至不是列表实现的通用接口的一部分,而且它们确实已经有很多方法)

于 2012-07-27T14:46:58.510 回答