ToList(): ¿crea una nueva lista?
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;
}
Sí, ToList
creará una nueva lista, pero como en este caso MyObject
es un tipo de referencia, la nueva lista contendrá referencias a los mismos objetos que la lista original.
La actualización de la SimpleInt
propiedad de un objeto al que se hace referencia en la nueva lista también afectará al objeto equivalente en la lista original.
(Si MyObject
se declaró como struct
en lugar de class
entonces 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).
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.
ToList
siempre 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, ToList
todavía contendrá el primer objeto.
Sin embargo, si modifica uno de los objetos en la lista original, ToList
seguirá conteniendo el mismo objeto (modificado).