¿Cómo funciona la siguiente instrucción LINQ ?
Aquí está mi código:
var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
Console.WriteLine(i);
}
Salida: 2, 4, 6, 8
¿Por qué no 2, 4, 6
?
Respuestas:
La salida es
2,4,6,8
a causa de la ejecución diferida .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:
Si desea que la salida sea
2,4,6
, use.ToList()
:fuente
.First()
,.FirstOrDefault()
,.Single()
y.SingleOrDefault()
también desencadenar la evaluación de la consulta.Esto ha sucedido debido a la ejecución diferida, lo que significa que el cálculo de la expresión no se ejecuta hasta que se necesita en algún lugar. Esto mejora el rendimiento si los datos son demasiado grandes.
fuente
La razón de esto es la ejecución diferida de su expresión lambda. La consulta se ejecuta cuando comienza a iterar en el bucle foreach.
fuente
Cuando usa un IEnumerable <> obtenido de LINQ, solo se crea una clase Enumerator y la iteración solo comienza cuando la usa en alguna caminata.
fuente
Obtendrá este resultado debido a la ejecución diferida, lo que significa que el resultado no se evalúa hasta su primer acceso.
Para que quede más claro, solo agregue 10 a la lista al final de su snipet y luego imprima nuevamente, no obtendrá 10 en la salida
fuente
10
en la salida.8
en ninguna salida.