2009-12-01 6 views
6

Dire que j'ai le code suivant (contexte rétréci vers le bas pour maintenir le champ de question limitée)Réécrivez ceci pour chaque rendement à un rendement 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); 
    } 
} 

Je voudrais les réécrire à quelque chose comme ça (ce qui ne hors cours compile pas

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

Le point clé étant que dans mon premier extrait que j'ai deux agents recenseurs foreach offrant un rendement que je ne sais pas comment faire dans LINQ sans perdre mes fonctionnalités de chargement paresseux

Répondre

15

Vous voulez Concat:

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

Notez également que vous n'avez pas besoin de yield return dans lambdas.

+0

Merci, ne s'est pas rendu compte que la concat était paresseux –

+1

Pour autant que je sache toutes les méthodes sur Enumerable qui retournent un IEnumerable sont paresseux. – Joren

+0

Vrai, mais je suppose que pour une raison quelconque Concat renverrait un IList –

Questions connexes