相关疑难解决方法(0)

将这个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);
    }
}
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中做什么而不会丢失我的延迟加载功能.

.net c# linq yield lazy-loading

6
推荐指数
1
解决办法
9202
查看次数

如何使用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)

.net linq mergesort

4
推荐指数
2
解决办法
2222
查看次数

标签 统计

.net ×2

linq ×2

c# ×1

lazy-loading ×1

mergesort ×1

yield ×1