2012-07-27 5 views
9

なぜObservableCollectionにのようなRemoveAllメソッドがないのですか?なぜObservableCollectionにRemoveAllメソッドがないのですか?

私はObservableCollectionに、この機能を提供するために、拡張メソッドを実装しているが、この機能を提供していないため、特定の理由がある場合、私は理解したいと思います。

データバインドコレクションの変更のために何らかの形でですか? This投稿では、ObservableCollectionsを使用している間に間違っているかもしれないが、この質問には対処しないいくつかの項目を指定しています。

+1

Clear()メソッドを見ましたか? (http://msdn.microsoft.com/en-us/library/ms132405.aspx) – Eirik

+0

それはコレクションからすべての要素を削除するClear()メソッドがあります。 – Dante

+1

まあ、RemoveAll()メソッドはコレクションをクリアするためのものではありません。 ListでもClear()メソッドがあります。特定の条件に一致するすべてのアイテムを削除することを意図しています。 –

答えて

17

代わりに使用できるすべてのアイテムを削除する方法があります。

私は、彼らがClear代わりのRemoveAllを使用理由を推測するハザードがあった場合、私はClearの項目が単純にクリアされているかを示しますながらRemoveAllは、あなたがコレクションから項目を削除する提案を運ぶので、それが可能だと思います。

これは、通知が発生するCollectionChanged通知のタイプに違いがあります。 Clear()NotifyCollectionChangedAction.Clearイベントを発生させ、削除されたアイテムはイベントに含めません。RemoveNotifyCollectionChangedAction.Removedイベントを発生させ、削除されたアイテムをイベントに渡します。

You cannot raise a CollectionChanged event with multiple itemsですので、すべてのアイテムを削除してNotifyCollectionChangedAction.Removedイベントを発生させると例外がスローされます。代わりに、削除されたすべてのアイテムに対してCollectionChangedイベントを発生させることがあります。これはパフォーマンス上かなり悪い可能性があります。 NotifyCollectionChangedAction.Resetイベントを発生させるだけで、ユーザーがアイテムを削除するときにRemovedイベントが発生すると予想されるときに混乱が生じることがあります。

.RemoveAll()の代わりに.Clear()を使用することにしました。その名前は実際に何が起こっているのかをよりよく説明しているためです。

+0

私はこれがそれを説明すると思います。そのような詳細な説明をありがとう。 –

1

Reverseまたは他の方法を実装していない理由を尋ねることもあります。最も一般的で絶対的に必要な方法以上のものを実装する理由はありません。 AddRemoveの横のすべては便利です。 (RemoveAllは実装されている共通インターフェイスの一部ではなく、すでに多くの方法があります)

関連する問題