2012-07-27 126 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甚至不是列表工具的常用接口的一部分,而且它們的確有很多方法)

相關問題