2011-11-15 14 views
22

voglio convertire gli elementi inseriti in un elenco Stringa da:Come convertire Lista <string> a ReadOnlyCollection <string> in C#

System.Collections.ObjectModel.ReadOnlyCollection<string> 

Ho provato con:

(System.Collections.ObjectModel.ReadOnlyCollection<string>)listname 

ma restituisce un errore .

+0

possibile duplicato del [Return ReadOnlyCollection da IList <>] (http://stackoverflow.com/questions/7227611/return-readonlycollection-from-ilist) – nawfal

risposta

34

È possibile creare una nuova istanza utilizzando l'elenco esistente nel costruttore.

var readOnlyList = new ReadOnlyCollection<string>(existingList); 

ReadOnlyCollection(Of T) Constructor on MSDN

+0

Questo è proprio quello che voglio.Grazie a tutti voi per rispondere a questa domanda. – techno

2

Il costruttore di ReadOnlyCollection accetta un IList

Ecco qualche riferimento http://msdn.microsoft.com/en-us/library/ms132476.aspx

var myreadonlycollection = new ReadOnlyCollection<string>(listname); 
+0

@Errorstacks ... Grazie per il downvote. ma non dovresti plagiare. –

+0

uguale a te .. ma non ho visto i tuoi ans prima di rispondere a questa domanda ... –

+0

@Errorstacks .... lol è divertente non ho mai detto che stavi copiando da me. Ma hai copiato il codice esatto da MSDN. Basta fare riferimento al link e descrivere. –

3
var readonlyCollection = new ReadOnlyCollection<string>(list); 
26

Se hai:

List<string> names=new List<string>(){"Rod", "Jane", "Freddy"};

allora si può dire:

ReadOnlyCollection<string> readOnlyNames=names.AsReadOnly();

Questo non copia la lista. Invece, la raccolta di sola lettura memorizza un riferimento all'elenco originale e vieta di cambiarlo. Tuttavia, se modifichi l'elenco sottostante tramite names, cambierà anche lo readOnlyNames, quindi è meglio scartare l'istanza scrivibile se possibile.

0

Le altre risposte sono corrette in quanto è necessario passare un IList<T> al costruttore di un ReadOnlyCollection<T>.

trovo utile avere un metodo di estensione su IEnumerable<T> che facilita la creazione del ReadOnlyCollection<T>:

public static ReadOnlyCollection<T> ToReadOnlyCollection<T>(
    this IEnumerable<T> source) 
{ 
    if (source == null) throw new ArgumentNullException("source"); 

    return new ReadOnlyCollection<T>(
     source as IList<T> ?? source.ToList()); 
} 
+5

Quindi il tuo 'source.ToReadOnlyCollection()' è praticamente equivalente a 'source.ToList(). AsReadOnly()'. (Inoltre, il tuo codice si comporta in modo diverso a seconda che sia passato o meno "IEnumerable <>" è già un "IList <>". Se è così, eventuali future mutazioni di tale raccolta sorgente si rifletteranno in "ReadOnlyCollection <> '; in caso contrario,' ReadOnlyCollection <> 'è effettivamente immutabile.) – LukeH

Problemi correlati