¿Por qué no se ejecuta esta consulta LINQ cuando se usa foreach?
Al crear nuevos objetos en una declaración LINQ, por ejemplo:
var list = new List<string>() { "a", "b", "c" };
var created = from i in list select new A();
Con la clase A luciendo así:
class A
{
public string Label;
}
Y luego modificando las propiedades en A con un bucle foreach:
foreach (var c in created) {
c.Label = "Set";
}
¿Por qué no se establecen los valores al acceder a los objetos en elIEnumerable
después. P.ej. la siguiente afirmación falla:
Assert.AreEqual("Set", created.ElementAt(2).Label);
Me pregunto por qué sucede esto. Espero que la instrucción foreach ejecute la consulta y desencadene la creación de los objetos. Estados de documentación de MSDN:"La ejecución de la consulta se aplaza hasta que la variable de consulta se repite en un bucle foreach o For Each".
He reproducido este comportamiento con .NET 4.5 y Mono 3.2.0. VocaciónToList
sobre elIEnumerable
antes de acceder al objeto creado hace que este problema desaparezca.