假设我有以下代码(上下文缩小以保持问题范围有限)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想把它们改写成这样的东西(当然不会编译
public static IEnumerable<Color> GetThemColors(){
GetThePrimaryIds().Select(id=>yield return GetColorById(id));
GetTheOtherIds().Select(id=>yield return GetOtherColorsById(id));
}
Run Code Online (Sandbox Code Playgroud)
关键点在于,在我的第一个片段中,我有两个foreach枚举器屈服,我不知道如何在linq中做什么而不会丢失我的延迟加载功能.
假设您有两个IEnumerbale对象.我们如何合并它们(在某些情况下,例如合并排序合并......)并创建一个独特的IEnumerable?我试过这个Zip,但在Zip中,两个列表大小应该相等(也许你没有得到异常,但也许我们丢失了一些数据.)
另外,我通过使用Enumerable.Range(...)来尝试它.选择(...)但我没有得到可接受的结果.
此外,我的问题与使用Union或者这个问题完全不同,实际上正如我所说的那样,在合并排序中合并我喜欢保留列表顺序(实际上只是想填补第一个列表中的一些空白).
使用for循环很容易处理它,但我看不到任何完整的linq方式.
编辑:
Sample input:
lst1 = {5,10,12}
lst2 = {7,9,16,20,25}
result: {5,7,9,10,12,16,20,25}
Run Code Online (Sandbox Code Playgroud)
这可以通过for循环和两个指针来完成,O(n + m)但我正在寻找linq解决方案O(n+m)
for循环解决方案:
var lst1 = new List<int> { 5, 10, 12 };
var lst2 = new List<int> { 7, 9, 16, 20, 25 };
var result = new List<int>();
int j = 0;
for (int i = 0; i < lst1.Count; i++)
{
while (j < lst2.Count && lst2[j] < lst1[i])
{ …Run Code Online (Sandbox Code Playgroud)