2010-03-24 9 views
9

Al escribir una cadena método para LINQ, puedo hacer las donde las declaraciones de dos maneras:Linq Where Cláusulas: ¿es mejor apilar o combinar?

var blackOldCats = cats.Where(cat => cat.Age > 7 && cat.Colour == "noir") 

O

var blackOldCats = cats.Where(cat => cat.Age > 7).Where(cat => cat.Colour == "noir") 

¿Hay ventajas de uno sobre el otro?

No se preocupe demasiado por los tipos de datos en este ejemplo, pero si hay problemas con los tipos de datos, entonces sería bueno saberlo también.

El más obvio es que el objeto ya está referenciado, por lo que dos propiedades al mismo tiempo es más fácil en la aplicación, ¿no?

+0

Cuando pregunta acerca de los beneficios, ¿se refiere a Rendimiento, legibilidad u otra cosa? – Kane

+0

Cualquier beneficio, excepto la legibilidad, ya que ambos son bastante legibles en mi POV – Dann

Respuesta

3

En su ejemplo, son iguales y son una cuestión de preferencia personal. Debido a la ejecución diferida de LINQ, la colección se repetirá solo una vez.

Si desea combinar sus expresiones con un operador u, solo puede usar la primera.

+0

No me di cuenta de que el LINQ funcionaba así (aunque ahora tiene sentido). Estaba pensando que el primero iba a ser el más rápido debido a la comparación combinada. Feliz, pongo esta Q ahora. – Dann

0

El primero sería un poco más rápido, ya que reduce un poco la sobrecarga. Aparte de eso, se procesan básicamente de la misma manera.

Una diferencia notable, sin embargo, es que la propiedad Color se compara antes que la propiedad en el segundo ejemplo. Si quieres una comparación más barato cortocircuito uno más caro (por lo que la propiedad Color solamente se compara a los elementos en los que la comparación Age es verdadera), se debería poner el más barato en el último Where llamada:

var blackOldCats = 
    cats 
    .Where(cat => cat.Colour == "noir") 
    .Where(cat => cat.Age > 7); 

En este caso, no hay mucha diferencia en el costo de las comparaciones, pero si uno es mucho más caro que el otro, es bueno saber en qué orden se evalúan.

+2

¿Podría explicar por qué poner la comparación más barata al final, en lugar de al frente? Lo haría al revés, pero solo por instinto, no por buenas razones. =) – Jens

+1

Escribí una pequeña aplicación de prueba, que confirma mi instinto aquí (dos cláusulas where, una toma un Thread.Sleep corto, la otra es rápida). Cada vez que la llamada parece ejecutarse sobre el resultado de la anterior, las comparaciones más baratas deberían ser las primeras. ¿Cometí un error? – Jens

+0

Jens tiene razón, su afirmación es al revés. Acabo de probarlo también con un método que otorga derechos a la consola cuando se golpea, y los métodos se ejecutan en secuencia, de izquierda a derecha – Dann

Cuestiones relacionadas