tutorial sintaxis framework español ejemplos c# .net linq

c# - sintaxis - ¿Debo usar dos cláusulas "where" o "&&" en mi consulta LINQ?



linq c# using (4)

Como otros han sugerido, es más una preferencia personal. Me gusta el uso de && ya que es más legible e imita la sintaxis de otros lenguajes principales.

Al escribir una consulta LINQ con varias condiciones "y", ¿debería escribir una sola cláusula where que contenga && o múltiples cláusulas where , una para cada condición?

static void Main(string[] args) { var ints = new List<int>(Enumerable.Range(-10, 20)); var positiveEvensA = from i in ints where (i > 0) && ((i % 2) == 0) select i; var positiveEvensB = from i in ints where i > 0 where (i % 2) == 0 select i; System.Diagnostics.Debug.Assert(positiveEvensA.Count() == positiveEvensB.Count()); }

¿Hay alguna diferencia además de las preferencias personales o el estilo de codificación (líneas largas, legibilidad, etc.) entre positiveEvensA y positiveEvensB ?

Una posible diferencia que viene a la mente es que los diferentes proveedores de LINQ pueden ser capaces de lidiar mejor con múltiples where s en lugar de una expresión más compleja; ¿Es esto cierto?



Esto es principalmente un problema de estilo personal. Personalmente, siempre que la cláusula where encaje en una línea, agrupo las cláusulas.

Usar múltiples where''s tenderá a ser menos eficiente porque requiere una invocación de delegado adicional para cada elemento que llega tan lejos. Sin embargo, es probable que sea un problema insignificante y solo debe considerarse si un generador de perfiles lo muestra como un problema.


Personalmente siempre iría con las cláusulas && vs. two where siempre que no haga que la declaración sea ininteligible.

En su caso, probablemente no será notorio en absoluto, pero tener 2 cláusulas where definitivamente tendrá un impacto en el rendimiento si tiene una colección grande, y si usa todos los resultados de esta consulta. Por ejemplo, si llama a .Count () en los resultados, o itera a través de toda la lista, se ejecutará la primera cláusula where, creando un nuevo IEnumerable que será completamente enumerado nuevamente, con un segundo delegado.

Al unir las 2 cláusulas juntas, la consulta forma un único delegado que se ejecuta a medida que se enumera la colección. Esto da como resultado una enumeración a través de la colección y una llamada al delegado cada vez que se devuelve un resultado.

Si los divides, las cosas cambian. Como su cláusula first where enumera a través de la colección original, la cláusula second where enumera sus resultados. Esto provoca, potencialmente (el peor de los casos), 2 enumeraciones completas a través de su colección y 2 delegados llamados por miembro, lo que podría significar que esta afirmación (teóricamente) podría tomar 2 veces la velocidad del tiempo de ejecución.

Si decide usar las cláusulas 2 where, ubicar la cláusula más restrictiva primero ayudará bastante, ya que la cláusula second where solo se ejecuta en los elementos que pasan la primera.

Ahora, en tu caso, esto no importará. En una gran colección, podría. Como regla general, voy por:

1) Legibilidad y mantenimiento

2) Rendimiento

En este caso, creo que ambas opciones son igualmente mantenibles, así que optaría por la opción más eficiente.