La salida es 2,4,6,8
a causa de la ejecución diferida .
La consulta se ejecuta realmente cuando la variable de consulta se repite, no cuando se crea la variable de consulta. Esto se llama ejecución diferida.
- Suprotim Agarwal, "Ejecución de consulta diferida vs inmediata en LINQ"
Hay otra ejecución llamada Ejecución de consulta inmediata , que es útil para almacenar en caché los resultados de la consulta. De Suprotim Agarwal nuevamente:
Para forzar la ejecución inmediata de una consulta que no produce un valor singleton, puede llamar al método ToList(), ToDictionary(), ToArray(), Count(), Average()
o Max()
en una consulta o variable de consulta. Estos se denominan operadores de conversión que le permiten hacer una copia / instantánea del resultado y el acceso es tantas veces como lo desee, sin la necesidad de volver a ejecutar la consulta.
Si desea que la salida sea 2,4,6
, use .ToList()
:
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).ToList();
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}