6

次のコードがあるとします(質問の範囲を制限するためにコンテキストを絞り込みました)

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

重要な点は、最初のスニペットで2つのforeach列挙子が生成されることです。これは、遅延読み込み機能を失うことなくlinqで実行する方法がわかりません。

4

1 に答える 1

15

あなたが欲しいConcat

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

また、ラムダでは必要ないことに注意してくださいyield return

于 2009-12-01T09:12:20.953 に答える