ToList(): ¿crea una nueva lista?

Resuelto Graviton asked hace 14 años • 12 respuestas

digamos que tengo una clase

public class MyObject
{
    public int SimpleInt { get; set; }
}

Y tengo un List<MyObject>, lo hago ToList()y luego cambio uno de ellos SimpleInt, mi cambio se propagará a la lista original. En otras palabras, ¿cuál sería el resultado del siguiente método y por qué?

public void RunChangeList()
{
    var objs = new List<MyObject>(){ new MyObject() { SimpleInt = 0 } };
    var whatInt = ChangeToList(objs);
}

public int ChangeToList(List<MyObject> objects)
{
    var objectList = objects.ToList();
    objectList[0].SimpleInt = 5;
    return objects[0].SimpleInt;
}
Graviton avatar May 05 '10 21:05 Graviton
Aceptado

Sí, ToListcreará una nueva lista, pero como en este caso MyObjectes un tipo de referencia, la nueva lista contendrá referencias a los mismos objetos que la lista original.

La actualización de la SimpleIntpropiedad de un objeto al que se hace referencia en la nueva lista también afectará al objeto equivalente en la lista original.

(Si MyObjectse declaró como structen lugar de classentonces la nueva lista contendría copias de los elementos de la lista original, y la actualización de una propiedad de un elemento en la nueva lista no afectaría al elemento equivalente en la lista original).

LukeH avatar May 05 '2010 14:05 LukeH

De la fuente de Reflector:

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    return new List<TSource>(source);
}

Entonces sí, su lista original no se actualizará (es decir, adiciones o eliminaciones), sin embargo, los objetos a los que se hace referencia sí lo harán.

Chris S avatar May 05 '2010 14:05 Chris S

ToListsiempre creará una nueva lista, que no reflejará ningún cambio posterior en la colección.

Sin embargo, reflejará cambios en los objetos mismos (a menos que sean estructuras mutables).

En otras palabras, si reemplaza un objeto en la lista original con un objeto diferente, ToListtodavía contendrá el primer objeto.
Sin embargo, si modifica uno de los objetos en la lista original, ToListseguirá conteniendo el mismo objeto (modificado).

SLaks avatar May 05 '2010 14:05 SLaks