sintaxis query framework examples ejemplos c# .net linq

c# - query - ¿Cómo funciona la siguiente declaración LINQ?



linq c# using (5)

¿Cómo funciona la siguiente declaració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 ?


Cuando usa un IEnumerable <> obtenido de LINQ, solo se crea una clase Enumerator y la iteración solo comienza cuando la usa en algún paseo.


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.


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 ciclo foreach.


La salida es 2,4,6,8 debido a la ejecución diferida .

La consulta se ejecuta realmente cuando se itera la variable de consulta, no cuando se crea la variable de consulta. Esto se llama ejecución diferida.

- Suprotim Agarwal, "Ejecución de consulta diferida frente a inmediata en LINQ"

Hay otra ejecución llamada Ejecución de consulta inmediata , que es útil para el almacenamiento en caché de 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 ToList(), ToDictionary(), ToArray(), Count(), Average() o Max() en una consulta o variable de consulta. Estos se llaman operadores de conversión que le permiten hacer una copia / instantánea del resultado y acceder tantas veces como 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); }


Obtiene este resultado debido a la ejecución diferida, lo que significa que el resultado no se evalúa hasta que se accedió por primera vez.

Para hacerlo más claro, simplemente agregue 10 a la lista al final de su snipet y luego imprima de nuevo, no obtendrá 10 en la salida

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); } //new* list.Add(10); foreach (var i in even) { Console.WriteLine(i); }