2009-09-25 14 views
20

¿Cuáles son las ventajas/desventajas de ambos enfoques?yield return versus return select

return items.Select(item => DoSomething(item)); 

frente

foreach(var item in items) 
{ 
    yield return DoSomething(item); 
} 

EDITAR Como son MSIL más o menos equivalente, que se encuentra más legible?

+11

Su segundo fragmento de código es la * implementación * de Seleccionar. (Suponiendo que esto es LINQ to Objects.) Eso es todo Select: ejecuta un bucle foreach, ejecuta el delegado en cada elemento y arroja los resultados. –

+0

sí. Pero todavía hay diferencias al escribir el primero y el segundo. Primera diferencia: número de LOC, segunda diferencia: legibilidad, tercera diferencia: cuando el retorno de rendimiento está presente en un método, se aplican algunas restricciones (es decir: no puede poner la selección de retorno después del rendimiento en el mismo método). –

Respuesta

17

La técnica yield return hace que el compilador de C# genere una clase de enumerador "entre bastidores", mientras que la llamada Select utiliza una clase de enumerador estándar parametrizada con un delegado. En la práctica, no debe haber una gran diferencia entre los dos, aparte de posiblemente un marco de llamada adicional en el caso Select, para el delegado.

Por lo que vale la pena, envolviendo una lambda alrededor de DoSomething es un poco inútil también; solo pase un delegado directamente.

+1

¿Qué va a ser diferente de pasar un delegado, en lugar de un lambda, en este caso? –

+9

devolver elementos. Seleccionar (Hacer algo); –

+0

Ah, así, no pensé en eso. –

3

Seleccionar solo le permite devolver un objeto para cada artículo en su colección "artículos". El uso de .Where(x => DoIReallyWantThis(x)) adicional le permite eliminar elementos no deseados, pero solo le permite devolver un objeto por artículo. Si desea potencialmente más de un objeto por artículo, puede usar .SelectMany pero es fácil terminar con una única línea larga que es menos que fácil de leer.

"rentabilidad de rendimiento" tiene el potencial de hacer que su código sea más legible si está buscando a través de una estructura de datos compleja y seleccionando bits de información aquí y allá. El mejor ejemplo de esto que he visto fue donde había alrededor de una docena de condiciones separadas que darían como resultado un objeto devuelto, y en cada caso el objeto devuelto se construyó de manera diferente.

9

En el mundo empresarial de movimiento lento, donde actualmente Paso más tiempo de lo que me gustaría, yield return tiene la enorme ventaja de que no necesita ese nuevo .NET Framework 3.5 que no va a ser instalado por lo al menos otros 2 años.

+0

Respuesta genial. Pero .NET Framework 3.5 se actualizará pronto (4.0). –

+10

".NET Framework 3.5 se actualizará pronto" - No donde trabajo :( – Joe