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>();
        }

    }

}
¿Fue útil?

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>

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top