2009-12-01 17 views
6

Decir que tengo el siguiente código (contexto reducido como para mantener el alcance limitado pregunta)¿Reescribir este rendimiento de foreach a un rendimiento de linq?

public static IEnumerable<Color> GetThemColors(){ 
    var ids = GetThePrimaryIds(); 
    foreach (int id in ids){ 
     yield return GetColorById(id); 
    } 
    ids = GetTheOtherIds(); 
    foreach (int id in ids){ 
     yield return GetOtherColorsById(id); 
    } 
} 

me gustaría volver a escribir a algo como esto (que por supuesto no se compila

public static IEnumerable<Color> GetThemColors(){ 
    GetThePrimaryIds().Select(id=>yield return GetColorById(id)); 
    GetTheOtherIds().Select(id=>yield return GetOtherColorsById(id));  
} 
.

El punto clave es que en mi primer fragmento tengo dos enumeradores foreach rendimiento, que no sé cómo hacerlo en LINQ sin perder mis características de carga perezosa

Respuesta

15

¿quieres Concat:

return GetThePrimaryIds().Select(id => GetColorById(id)).Concat(
    GetTheOtherIds().Select(id => GetOtherColorsById(id))); 

También tenga en cuenta que no necesita yield return en lambdas.

+0

Gracias, no me di cuenta que el concat era flojo –

+1

Por lo que sé, todos los métodos en Enumerable que devuelven un IEnumerable son flojos. – Joren

+0

Es cierto, pero asumí que por alguna razón Concat devolvería un IList –