2012-07-27 11 views
9

¿Por qué ObservableCollection no tiene el método RemoveAll como List?¿Por qué ObservableCollection no tiene un método RemoveAll?

he implementado un método de extensión para proporcionar esta funcionalidad a la ObservableCollection, pero me gustaría entender si hay una razón específica por no proporcionar esta funcionalidad.

Posiblemente afecte Enlace de datos de alguna manera debido a ¿Colección de cambio? La publicación This especifica algunas cosas que pueden salir mal durante el uso de ObservableCollections, pero no aborda esta cuestión.

+1

¿Has mirado el método Clear()? (http://msdn.microsoft.com/en-us/library/ms132405.aspx) – Eirik

+0

Tiene el método Clear(), que elimina todos los elementos de la colección. – Dante

+1

Bueno, el método RemoveAll() no está destinado a borrar la colección. Incluso la lista tiene un método Clear(). Está destinado a Eliminar todos los artículos que coinciden con un determinado criterio. –

Respuesta

17

Tiene un método Clear() que elimina todos los elementos que puede usar.

Si tuviera que aventurar una conjetura en cuanto a por qué se utilizan Clear en lugar de RemoveAll, creo que sería porque RemoveAll lleva a la sugerencia de que tiene que quitar artículos de la colección, mientras que Clear le indica los elementos simplemente se están limpiando .

Esto hace una diferencia en el tipo de notificación CollectionChanged que se genera. Clear() provoca un evento NotifyCollectionChangedAction.Clear y no incluye los elementos eliminados en el evento, mientras que Remove genera un evento NotifyCollectionChangedAction.Removed y pasa el elemento eliminado al evento.

You cannot raise a CollectionChanged event with multiple items, por lo que plantear un evento NotifyCollectionChangedAction.Removed con todos los elementos eliminados arrojaría una excepción. La alternativa sería plantear un evento CollectionChanged por cada artículo que se eliminó, lo que puede ser bastante malo para el rendimiento. Y simplemente generar un evento NotifyCollectionChangedAction.Reset causaría cierta confusión cuando los usuarios esperan que ocurra un evento Removed cuando están eliminando elementos.

Supongo que decidieron simplemente usar .Clear() en lugar de .RemoveAll() porque el nombre es una mejor descripción de lo que está sucediendo realmente detrás de las escenas.

+0

Creo que esto lo explica. Gracias por una explicación tan detallada. –

1

Es mejor preguntar por qué no implementa Reverse o cualquier otro método. Simplemente no hay razón para implementar más que los métodos más comunes y absolutamente necesarios. Todo junto a Add y Remove es solo de conveniencia. (RemoveAll ni siquiera es parte de las interfaces comunes que las listas implementan, y ya tienen muchos métodos)

Cuestiones relacionadas