2012-07-27 18 views
9

Perché ObservableCollection non ha il metodo RemoveAll come un List?Perché ObservableCollection non ha un metodo RemoveAll?

Ho implementato un'estensione metodo per fornire questa funzionalità al ObservableCollection, ma vorrei capire se c'è un motivo specifico per non fornire questa funzionalità.

sarebbe eventualmente effettuare Associazione dati in qualche modo a causa di cambiamenti Collection? This post specifica alcune cose che potrebbero andare storte durante l'utilizzo di ObservableCollections, ma non risolve questo problema.

+1

Hai guardato il metodo Clear()? (http://msdn.microsoft.com/en-us/library/ms132405.aspx) – Eirik

+0

Ha il metodo Clear(), che rimuove tutti gli elementi dalla Raccolta. – Dante

+1

Bene, il metodo RemoveAll() non è destinato a cancellare la raccolta. Anche l'elenco ha un metodo Clear(). È destinato a rimuovere tutti gli elementi che corrispondono a un determinato criterio. –

risposta

17

Ha un metodo Clear() che rimuove tutti gli elementi che è possibile utilizzare.

Se dovessi azzardare un'ipotesi sul perché hanno usato Clear invece di RemoveAll, penso che sarebbe stato perché RemoveAll porta il suggerimento che si sta rimuovendo gli elementi della collezione, mentre Clear ti dice le voci sono semplicemente essere cancellati .

Questo fa la differenza nel tipo di notifica CollectionChanged che viene generato. Clear() genera un evento NotifyCollectionChangedAction.Clear e non include gli elementi rimossi nell'evento, mentre Remove genera un evento NotifyCollectionChangedAction.Removed e passa l'elemento rimosso all'evento.

You cannot raise a CollectionChanged event with multiple items, pertanto l'aumento di un evento NotifyCollectionChangedAction.Removed con tutti gli elementi rimossi genererebbe un'eccezione. L'alternativa sarebbe sollevare un evento CollectionChanged per ogni oggetto rimosso, il che può essere piuttosto negativo per le prestazioni. E semplicemente sollevare un evento NotifyCollectionChangedAction.Reset causerebbe un po 'di confusione quando gli utenti si aspettano che si verifichi un evento Removed quando rimuovono gli articoli.

Quindi immagino che abbiano deciso di utilizzare semplicemente .Clear() anziché .RemoveAll() perché il nome è una descrizione migliore di ciò che sta effettivamente accadendo dietro le quinte.

+0

Penso che questo lo spieghi. Grazie per una spiegazione così dettagliata. –

1

Si potrebbe anche chiedere perché non implementa Reverse o qualsiasi altro metodo. Semplicemente non c'è motivo di implementare più dei metodi più comuni e assolutamente necessari. Tutto a fianco di Add e Remove è solo comodità. (RemoveAll non fa nemmeno parte delle interfacce comuni che elencano l'attrezzo e hanno già molti metodi)

Problemi correlati