2010-12-20 15 views
5

He estado leyendo C# In Depth: Second Edition de Jon Skeet y noté algo ligeramente diferente en uno de sus ejemplos de algo que hago yo mismo.Linq con notación de puntos: ¿cuál es la mejor forma o cuál es la diferencia entre estos dos?

Él tiene algo similar a lo siguiente:

var item = someObject.Where(user => user.Id == Id).Single(); 

Mientras que yo he estado haciendo lo siguiente:

var item = someObject.Single(user => user.Id == Id); 

¿Hay alguna diferencia real entre los dos? Sé que Jon Skeet es prácticamente el dios C#, así que tiendo a pensar que su conocimiento en esta área es mejor que el mío, así que podría estar malinterpretando algo aquí. Espero que alguien pueda ayudar.

+0

Incluso los dioses cometen errores. Solo mire en California – Dismissile

+1

@Dismissile: WTF? California es el cielo en la Tierra. – jason

+0

@Jason. Sustituya California por su estado/lugar más odiado entonces :) El lugar puede ser agradable y soleado pero la gente es retardada;) – Dismissile

Respuesta

6

Las consultas deben ser iguales cuando se evalúa el árbol, sin embargo, dependiendo del objetivo, la ejecución real podría diferir (optimización de IE L2S).

1

Lo único que puedo notar es que el IL producido utilizando el método Where es una fila más grande que el segundo ejemplo (probado a través de LinqPAD).

IL_0042: call  System.Linq.Enumerable.Where 
IL_0047: call  System.Linq.Enumerable.Single 

en lugar de una sola llamada a System.Linq.Enumerable.Single

IL_006B: call  System.Linq.Enumerable.Single 
+0

Esto es un comportamiento bastante lógico. – nothrow

+0

Sí :) Solo quiero señalar que parece ser solo una diferencia en el código IL. Usar Single en lugar de Where + Single será más eficiente en la compilación de JIT. – tanathos

1

Específicamente para Linq2Objects, yo personalmente prefiero usar la versión Enumerable.Single(this, predicate) directamente, simplemente porque la adición de la Enumerable.Where introducirá una enumeración adicional que Enumerable.Single se tire los datos de.

Al usar Enumerable.Single directamente en el enumerable primario, no se inician enumeraciones adicionales. Nunca comparé esto para evaluar el impacto real en el rendimiento, pero ¿por qué ejecutar más código cuando no es necesario hacerlo bien? Especialmente si la legibilidad no se ve afectada, por supuesto, este último punto es bastante subjetivo.

3

Normalmente piensa en en términos de "filtro y luego tome un valor único". Por otro lado, cuando se trata de Count a menudo usaré la versión con el predicado. Para Any puedo ir de cualquier manera bastante fácilmente dependiendo de mi estado de ánimo :)

En última instancia, es poco probable que haga una diferencia significativa, utilice lo que sea más fácil de entender en ese momento. Ciertamente no estaba tratando de evitar usando las versiones con predicados, etc - y doy algunos ejemplos de usarlos en P499.

Si bien hay algunas situaciones con versiones "definitivamente más legibles", muchos otros casos son igualmente legibles.

+0

No esperaba una respuesta tuya, mientras que tu respuesta es exactamente lo que estaba buscando, la respuesta aceptada me da la misma información, además de que tienes suficiente reputación :) – MyNameIsJob

Cuestiones relacionadas