【问题标题】:Why ObservableCollection does not have a RemoveAll method?为什么 ObservableCollection 没有 RemoveAll 方法?
【发布时间】:2012-07-26 04:40:19
【问题描述】:

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

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

由于Collection change,它是否会以某种方式影响数据绑定This 帖子确实指定了一些在使用 ObservableCollections 时可能出错的事情,但没有解决这个问题。

【问题讨论】:

  • 你看过 Clear() 方法了吗? (msdn.microsoft.com/en-us/library/ms132405.aspx)
  • 它有Clear()方法,从Collection中删除所有元素。
  • 好吧,RemoveAll() 方法并不是为了清除集合。甚至 List 也有一个 Clear() 方法。它旨在删除所有符合特定条件的项目。
  • 对于任何反对票,请说明原因。
  • @Blam:RemoveAll 不是界面的一部分。

标签: .net wpf observablecollection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果我不得不冒险猜测他们为什么使用Clear 而不是RemoveAll,我认为这是因为RemoveAll 提出了您正在从集合中删除项目的建议,而Clear 告诉你的项目只是被清除。

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

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

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

    【讨论】:

    • 我认为这可以解释。谢谢你这么详细的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多