2009-12-01 22 views
6

說我有下面的代碼(背景下縮小以保持問題包括但不限於)將這個foreach產量重寫爲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); 
    } 
} 

我想將它們改寫爲這樣的事情(這當然關不編譯

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

關鍵的一點是,在我的第一個片段,我有兩個的foreach枚舉屈服,我不知道如何在LINQ做不失去我的懶加載功能

回答

15

你想Concat

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

另請注意,您不需要在lambdas中使用yield return

+0

謝謝,沒有意識到concat是懶惰的 – 2009-12-01 09:25:09

+1

據我所知,Enumerable上返回IEnumerable的所有方法都是懶惰的。 – Joren 2009-12-01 10:07:16

+0

確實如此,但由於某種原因,Concat會返回一個IList – 2009-12-01 10:30:13