2010-09-08 6 views
14

Probablemente una pregunta estúpida, pero tengo un montón de:Sustitución si (x) foreach() con Foreach.Where (x)

if(X) 
{ 
    foreach(var Y in myList.Where(z => z == 1) 
    { 
    } 
} 

construcciones en algún código
está reemplazando con

foreach(var Y in myList.Where(z => X && z == 1) { } 

¿insano?

Probablemente sea menos legible, pero ¿el compilador lo optimizará para que sea prácticamente el mismo código?

+1

Evitar? ¿Por qué debería uno evitar esto? – Yagzii

Respuesta

19

No, su primera versión es mejor y más rápida. La segunda versión evaluará X para cada elemento en la secuencia siempre que X sea verdadero.

Debe quedarse con la primera versión.

4

La segunda opción será mucho más lenta cuando x es falsa, ya que hará que linq verifique todos los elementos de la lista cuando sepa que la verificación siempre fallará.

El optimizador del compilador no podrá deshacer su daño. Ese nivel de optimización solo es posible normalmente en lenguajes funcionales, ya que es demasiado difícil para un compilador rastrear posibles efectos secundarios.

Linq no tiene optimizaciones integradas que se acerquen a lo que espera de un reescritor de consultas SQL en una base de datos.

1

No se compilarán con el mismo código. En la segunda versión, X se evalúa muchas veces y se enumera myList. En el peor de los casos, la evaluación de X cambia algo, y tiene una funcionalidad impredecible.

Cuestiones relacionadas