2010-11-16 25 views
58

Tengo muchas entidades con List<> anidado en cada una.ObservableCollection <> vs. List <>

Por ejemplo, tengo BaseEntity que tiene List<ColumnEntity>. ColumnEntity clase tiene List<Info> y así sucesivamente.

Estamos trabajando con una interfaz de usuario WPF, y tenemos que hacer un seguimiento de todos los cambios en cada lista de BaseEntity. Se implementa instanciando un new ObservableCollection basado en la lista necesaria y con un enlace a ese ObservableCollection.

¿Cuáles son los pros y contras que cambian todos estos anidados Lists a ObservableCollections? Entonces, ¿podemos rastrear todos los cambios en el BaseEntity mismo sin reasignar cada lista de BaseEntity al límite modificado ObservableCollection?

Suponiendo que los métodos específicos de List nunca se utilizan.

Respuesta

64

una pregunta interesante, teniendo en cuenta que tanto la lista y ObservableCollection implementan IList<T> no hay mucha diferencia allí, ObservableCollection también implementa INotifyCollectionChanged interfaz, que permite WPF se una a él.

Una de las principales diferencias es que ObservableCollection no tiene el método AddRange, lo que podría tener algunas implicaciones.

Además, no utilizaría ObservableCollection para los lugares donde sé que no sería vinculante, por esta razón es importante revisar su diseño y asegurarse de que está tomando el enfoque correcto para separar las capas de preocupación.

En cuanto a las diferencias entre Collection<T> y List<T> se puede echar un vistazo aquí Generic Lists vs Collection

+1

El enlace está roto ... – Assimilater

+0

He reparado el enlace y se aprobó el cambio. – Joe

29

Depende exactamente lo que quiere decir con esto:

que necesitamos para realizar un seguimiento de todos los cambios en todas las listas de BaseEntity

¿Sería suficiente seguir los cambios a los objetos que ya están en la lista? ¿O necesita saber cuándo se eliminan/se agregan o se cambian los puestos dentro de la lista?

Si una lista contendrá los mismos artículos para toda su vida, pero los objetos individuales dentro de esa lista va a cambiar, entonces es suficiente para que sólo los objetos que plantean las notificaciones de cambio (normalmente a través de INotifyPropertyChanged) y List<T> es suficiente. Pero si la lista contendrá diferentes objetos de vez en cuando, o si la orden cambia, entonces debe usar ObservableCollection<T>.

Por lo tanto, aunque las diferencias pueden ser interesantes (y un póster anterior ya las ha cubierto), normalmente no tendrá tantas opciones, ya sea que necesite ObservableCollection<T> o no.

+3

Bien pensado. +1 – Subby

5

No veo ningún problema con eso, aparte de una sobrecarga de rendimiento muy marginal.

Tenga en cuenta que si modifica las Listas internas directamente, no recibirá notificaciones sobre cambios.Además, si los objetos que están contenidos en el ObservableCollection se modifican, no se le notificará. La notificación solo se produce si los elementos se agregan, reemplazan, eliminan o mueven.

9

La lista representa una lista fuertemente tipada de objetos a los que se puede acceder por índice. Proporciona métodos para buscar, ordenar y manipular listas. La clase List es el equivalente genérico de la clase ArrayList. Implementa la interfaz genérica IList utilizando una matriz cuyo tamaño se incrementa dinámicamente según sea necesario.

ObservableCollection es una colección de datos dinámicos genéricos que utiliza una interfaz "INotifyCollectionChanged" para proporcionar notificaciones cuando los artículos se agregan, eliminan o cuando se actualiza toda la colección.

Lea más sobre esto en este enlace: http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha

3

una diferencia más importante es que se puede acceder sólo desde ObservableCollection hilo en el que se creó en tanto que la lista se puede acceder fromany hilo.