将这个foreach产量重写为linq产量?

假设我有以下代码(上下文缩小以保持问题范围有限)

public static IEnumerable 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 GetThemColors(){ GetThePrimaryIds().Select(id=>yield return GetColorById(id)); GetTheOtherIds().Select(id=>yield return GetOtherColorsById(id)); } 

关键点在于,在我的第一个片段中,我有两个foreach枚举器屈服,我不知道如何在linq中做什么而不会丢失我的延迟加载function。

你想要Concat

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

另请注意,lambda中不需要yield return