Перепишите этот выход foreach в доход linq? - PullRequest
6 голосов
/ 01 декабря 2009

Скажем, у меня есть следующий код (контекст сужен, чтобы ограничить область действия вопроса)

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, не теряя своих функций ленивой загрузки.

1 Ответ

15 голосов
/ 01 декабря 2009

Вы хотите Concat:

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

Также обратите внимание, что вам не нужно yield return в лямбдах.

...