Evaluación diferida / ejecución diferida
Los bloques del iterador "rendimiento de retorno" no ejecutarán ninguno de los códigos hasta que realmente solicite ese resultado específico. Esto significa que también se pueden encadenar juntos de manera eficiente. Examen sorpresa: ¿cuántas veces se repetirá el siguiente código sobre el archivo?
var query = File.ReadLines(@"C:\MyFile.txt")
.Where(l => l.Contains("search text") )
.Select(l => int.Parse(l.SubString(5,8))
.Where(i => i > 10 );
int sum=0;
foreach (int value in query)
{
sum += value;
}
La respuesta es exactamente una, y no hasta el final del foreach
ciclo. Aunque tengo tres funciones de operador linq separadas, solo recorremos el contenido del archivo una vez.
Esto tiene otros beneficios además del rendimiento. Por ejemplo, puedo escribir un método bastante simple y genérico para leer y prefiltrar un archivo de registro una vez, y usar ese mismo método en varios lugares diferentes, donde cada uso agrega filtros diferentes. Por lo tanto, mantengo un buen rendimiento al mismo tiempo que reutilizo el código de manera eficiente.
Listas infinitas
Vea mi respuesta a esta pregunta para ver un buen ejemplo:
C # función fibonacci que devuelve errores
Básicamente, implemento la secuencia de fibonacci usando un bloque iterador que nunca se detendrá (al menos, no antes de llegar a MaxInt), y luego uso esa implementación de una manera segura.
Semántica mejorada y separación de preocupaciones
Una vez más, utilizando el ejemplo de archivo anterior, ahora podemos separar fácilmente el código que lee el archivo del código que filtra las líneas innecesarias del código que realmente analiza los resultados. Ese primero, especialmente, es muy reutilizable.
Esta es una de esas cosas que es mucho más difícil de explicar con prosa que a quién con una simple imagen visual 1 :
Si no puede ver la imagen, muestra dos versiones del mismo código, con resaltados de fondo para diferentes preocupaciones. El código linq tiene todos los colores bien agrupados, mientras que el código imperativo tradicional tiene los colores entremezclados. El autor argumenta (y estoy de acuerdo) que este resultado es típico de usar linq versus usar código imperativo ... que linq hace un mejor trabajo organizando su código para tener un mejor flujo entre las secciones.
1 Creo que esta es la fuente original: https://twitter.com/mariofusco/status/571999216039542784 . También tenga en cuenta que este código es Java, pero el C # sería similar.