2009-06-11 16 views
74

Da quello che posso dire, .NET 4.0 non dispone ancora di elenchi di sola lettura. Perché al framework manca ancora questa funzionalità? Non è questa una delle funzionalità più comuni per domain-driven design?Elenco di sola lettura o elenco non modificabile in .NET 4.0

Uno dei pochi vantaggi Java è su C# è presente nella forma del metodo Collections.unmodifiablelist(list), che a quanto pare è attesa da tempo in IList < T> o Lista < T>.

L'utilizzo di IEnumerable<T> è la soluzione più semplice alla domanda: è possibile utilizzare ToList e restituirne una copia.

+0

Sembra che l'unico vero modo per avere una sola lettura vera 'Lista ' è scrivere il proprio, non esiste una classe integrata che io sappia che supporti tutte le funzionalità di "sola lettura" di 'Lista ' fuori dalla scatola come 'Contiene', query LINQ, ecc. – jrh

risposta

110

Stai cercando ReadOnlyCollection, che è stato in giro da. NET2.

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

o

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

Questo crea una sola lettura vista, che riflette le modifiche apportate alla raccolta avvolto.

+0

Mi sento un po 'stupido aver fatto questa domanda ora - e non so di ReadOnlyCollection –

+36

non essere - nemmeno io, quando sono andato a cercare la stessa cosa e ho trovato la tua domanda –

+7

Questa è una classe fastidiosamente difficile da trovare. È nello spazio dei nomi System.Collections.ObjectModel invece di System.Collections.Generic dove mi aspetterei di trovarlo. Suppongo che sia perché era lì prima che esistesse lo spazio dei nomi generico. Ancora mi aspetto che la classe base rimanga in ObjectModel e la classe generica da aggiungere a Generic. Suppongo che avessero le loro ragioni, ma trovo fastidioso. – BlueMonkMN

7

In 2.0 è possibile chiamare AsReadOnly per ottenere una versione di sola lettura dell'elenco. Oppure avvolgi un IList esistente in un oggetto ReadOnlyCollection.

+0

è l'equivalente di Collections.unmodifiablelist (lista) ero dopo –

+0

Mi mancava questo in .NET 4 perché stavo usando un IList invece di un vero elenco . Assicurati di notare che AsReadOnly è ancora disponibile in .NET 4 finché hai a che fare con un Elenco . – BlueMonkMN

13

Che ne dici di ReadOnlyCollection già all'interno del framework?

9

Se il modello più comune dell'elenco è quello di scorrere tutti gli elementi, IEnumerable o IQueryable possono effettivamente funzionare come un elenco di sola lettura.

+2

Se esponi il tuo elenco come un oggetto IEnumerable, il consumatore potrebbe semplicemente riportarlo su List e modificarlo. – JulianR

+3

Certo, ma non è destinato a essere una misura a prova di proiettile - potresti anche probabilmente leggere i campi privati ​​e rintracciare l'elenco originale. È più come descrivere l'intento che questo dovrebbe rimanere di sola lettura. –

+5

Non stai modificando l'elenco originale chiamando 'ToList()', solo una copia –

5

Per coloro che desiderano utilizzare le interfacce: .NET 4.5 aggiunge l'interfaccia generica IReadOnlyList implementata da List<T> ad esempio.

È simile a IReadOnlyCollection e aggiunge una proprietà dell'indicizzatore Item.

Problemi correlati