2009-12-01 15 views
6

Dire che ho il seguente codice (contesto ristretto da mantenere la portata domanda limitata)Riscrivi questa resa foreach a un rendimento 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); 
    } 
} 

vorrei riscriverle a qualcosa di simile (che fuori rotta non può essere compilato

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

Il punto chiave è che nel mio primo frammento di ho due enumeratori foreach rendimento, che io non so come fare in LINQ senza perdere le mie caratteristiche pigro-caricamento

risposta

15

volete Concat:

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

Si noti inoltre che non è necessario yield return in lambda.

+0

Grazie, non ho capito che il concat era pigro –

+1

Per quanto ne so tutti i metodi su Enumerable che restituiscono un IEnumerable sono pigri. – Joren

+0

Vero, ma per qualche motivo Concat mi ha restituito un IList –

Problemi correlati