Cómo devolver una copia de sólo lectura de una colección
-
21-08-2019 - |
Pregunta
Tengo una clase que contiene una colección. Quiero proporcionado un método o propiedad que devuelve el contenido de la colección. Está bien si las clases que llaman pueden modificar los objetos individuales, pero no quiero que la adición o eliminación de objetos de la colección real. He estado copiando todos los objetos a una nueva lista, pero ahora estoy pensando que así podría volver la lista como IEnumerable <>.
En el ejemplo simplificado a continuación es GetListC la mejor manera de devolver una versión de solo lectura de una colección?
public class MyClass
{
private List<string> mylist;
public MyClass()
{
mylist = new List<string>();
}
public void Add(string toAdd)
{
mylist.Add(toAdd);
}
//Returns the list directly
public List<String> GetListA
{
get
{
return mylist;
}
}
//returns a copy of the list
public List<String> GetListB
{
get
{
List<string> returnList = new List<string>();
foreach (string st in this.mylist)
{
returnList.Add(st);
}
return returnList;
}
}
//Returns the list as IEnumerable
public IEnumerable<string> GetListC
{
get
{
return this.mylist.AsEnumerable<String>();
}
}
}
Solución
Puede utilizar List(T).AsReadOnly()
:
return this.mylist.AsReadOnly()
que devolverá un ReadOnlyCollection
.
Otros consejos
Sólo tiene que utilizar clase ReadOnlyCollection, se apoya desde .NET 2.0
Utilice la clase genérica ReadOnlyCollection (Collection.AsReadOnly()
). No copiar cualquier objeto que puede tener algunos resultados extraños cuando se cambia la colección subyacente.
var foo = new List<int> { 3, 1, 2 };
var bar = foo.AsReadOnly();
foreach (var x in bar) Console.WriteLine(x);
foo.Sort();
foreach (var x in bar) Console.WriteLine(x);
Pero si usted no quiere una copia, que es la mejor solución.
Yo prefiero volver IEnumerable, pero que no es necesario para emitir. Sólo haz
public IEnumerable<string> StringList { get { return myList; }
List<string>
es un IEnumerable<string>