2011-11-15 25 views
22

que desea convertir los artículos introducidos a una lista de cadenas a:Cómo convertir Lista <string> a ReadOnlyCollection <string> en C#

System.Collections.ObjectModel.ReadOnlyCollection<string> 

He intentado usar:

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

pero devuelve un error .

+0

posible duplicado de [Volver ReadOnlyCollection de IList <>] (http://stackoverflow.com/questions/7227611/return-readonlycollection-from-ilist) – nawfal

Respuesta

34

Se puede crear una nueva instancia utilizando la lista existente en el constructor.

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

ReadOnlyCollection(Of T) Constructor on MSDN

+0

Esto es justo lo que quiero. Gracias a todos por responder a esta pregunta. – techno

2

El constructor de ReadOnlyCollection acepta un IList

Aquí hay alguna referencia http://msdn.microsoft.com/en-us/library/ms132476.aspx

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

@Errorstacks ... Gracias por el downvote. pero no deberías plagiar –

+0

mismo para ti ... pero no vi tu pregunta antes de responder a esta pregunta ... –

+0

@Errorstacks .... jajaja es gracioso Nunca dije que estabas copiando de mí. Pero copió el código exacto de MSDN. Simplemente haga referencia al enlace y describa. –

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

Si usted tiene:

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

entonces se puede decir:

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

Esto no copia la lista. En cambio, la colección readonly almacena una referencia a la lista original y prohíbe cambiarla. Sin embargo, si modifica la lista subyacente a través de names, entonces el readOnlyNames también cambiará, por lo que es mejor descartar la instancia de escritura si puede.

0

Las otras respuestas son correctas en el sentido de que debe pasar un IList<T> al constructor de un ReadOnlyCollection<T>.

me resulta útil disponer de un método de extensión en IEnumerable<T> que facilita la creación de la 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

Así que su 'source.ToReadOnlyCollection()' es más o menos equivalente al 'source.toList() incorporado. AsReadOnly()'. (Además, su código se comporta de manera diferente dependiendo de si el 'IEnumerable <>' pasado ya es un 'IList <>'. Si es así, cualquier mutación futura de esa colección de fuentes se reflejará en su 'ReadOnlyCollection <> '; si no, entonces su' ReadOnlyCollection <> 'es efectivamente inmutable.) – LukeH

Cuestiones relacionadas