2009-12-01 28 views
6

ben ders dışı derleme değil böyle bir şey (bunları yeniden yazmak istiyorumBu foreach verimini linq verimine yeniden yazınız.

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); 
    } 
} 

(sınırlı soru kapsamını tutmak için aşağı daralmış bağlamı) Aşağıdaki kodu var ki

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

ilk snippet'te benim tembel yükleme özelliklerini kaybetmeden linq yapmak nasıl bilmiyorum, hangi veren iki foreach enumerator'ler olduğunu olmanın kilit noktası

cevap

15

Sen Concat istiyorum:

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

Ayrıca lambdas içinde yield return gerekmez unutmayın.

+0

Teşekkürler, uykunun tembel olduğunun farkında olmadı –

+1

Enumerable ile ilgili tüm yöntemleri bildiğim kadarıyla IEnumerable'ın geri dönüşü tembeldir. – Joren

+0

Doğru, ama bir sebepten dolayı Concat'ın bir IList döndüreceğini varsayalım. –