2009-06-11 15 views
74

Por lo que puedo decir, .NET 4.0 aún carece de listas de solo lectura. ¿Por qué el marco aún carece de esta funcionalidad? ¿No es esta una de las piezas más comunes de funcionalidad para domain-driven design?Lista de solo lectura o lista no modificable en .NET 4.0

Una de las pocas ventajas que tiene Java sobre C# es esta en la forma del método Collections.unmodifiablelist(list), que parece que hace mucho tiempo se debe en IList < T> o en la lista < T>.

El uso de IEnumerable<T> es la solución más sencilla a la pregunta - ToList se puede utilizar y devuelve una copia.

+0

Parece que la única manera real de tener una verdadera lectura solamente 'List ' es escribir la suya, no hay una clase incorporada que conozca que admita todas las características de "solo lectura" de 'List ' como 'Contiene', consultas LINQ, etc. – jrh

Respuesta

110

Está buscando ReadOnlyCollection, que ha estado presente desde .NET2.

IList<string> foo = ...; 
// ... 
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo); 

o

List<string> foo = ...; 
// ... 
ReadOnlyCollection<string> bar = foo.AsReadOnly(); 

Esto crea un solo lectura vista, lo que refleja los cambios realizados en la colección envuelta.

+0

Me siento un poco estúpido al hacer esta pregunta ahora, y no sé acerca de ReadOnlyCollection –

+36

no lo soy, ni lo hice, cuando fui a buscar lo mismo y encontré Tu pregunta –

+7

Esa es una clase difícil de encontrar. Está en el espacio de nombres System.Collections.ObjectModel en lugar de System.Collections.Generic donde esperaría encontrarlo. Supongo que es porque ahí es donde estaba antes de que existiera el espacio de nombres genérico. De todos modos, esperaría que la clase base permanezca en ObjectModel y la clase genérica que se agregará a Generic. Supongo que tenían sus razones, pero me parece molesto. – BlueMonkMN

7

En 2.0 puede llamar a AsReadOnly para obtener una versión de solo lectura de la lista. O envuelva un IList existente en un objeto ReadOnlyCollection.

+0

que es el equivalente de Collections.unmodifiablelist (lista) Estaba después de –

+0

Me perdí esto en .NET 4 porque estaba usando un IList en lugar de una verdadera lista . Asegúrese de darse cuenta de que AsReadOnly aún está disponible en .NET 4 siempre y cuando se trate de una a List . – BlueMonkMN

13

¿Qué tal ReadOnlyCollection ya dentro del marco?

9

Si el patrón más común de la lista es iterar a través de todos los elementos, IEnumerable o IQueryable también pueden actuar como una lista de solo lectura.

+2

Si expone su Lista como un Enumerable, entonces el consumidor simplemente podría devolverlo a la Lista y modificarlo. – JulianR

+3

Por supuesto, pero no tiene la intención de ser una medida a prueba de balas, también podría leer los campos privados y rastrear la lista original. Es más como describir el intento de que esto permanezca como de solo lectura. –

+5

No está modificando la lista original llamando a 'ToList()' tampoco, solo una copia –

5

Para aquellos que les gusta usar interfaces: .NET 4.5 agrega la interfaz IReadOnlyList genérica que se implementa por List<T> por ejemplo.

Es similar a IReadOnlyCollection y agrega una propiedad de indexador Item.

Cuestiones relacionadas