For循环在完成后重复并返回ArgumentOutOfRangeException

时间:2019-07-10 20:55:23

标签: c# for-loop repeat

我将foreach传递给for来提高性能。但是,我认为我的for很好,但是在运行之后,我不知道为什么它最后一次再重复1次(即使它与句子不对应),并且会抛出错误,因为其中不存在“ i”列表。

我已经搜索过,没有人遇到此错误,所以我很好奇。我的意思是条件很好,并且“第一次”可以很好地工作,但是随后,它从无处运行并中断。

这可能是因为我为list1做一个ToList()吗?因为调用数据库会返回IEnnumerable,所以我无法将其用于For循环。

    var list1 = GetData1FromDB().ToList();
        var list2 = GetData2FromDB();

        for (int i = 0; i <= list1.Count() - 1; i++)
        {
            var data2 = list2.Where(x => x.Id == list1[i].Id);
            list1[i].Details = data2;
            result.data1.Add(list1[i]);
        }

1 个答案:

答案 0 :(得分:4)

我怀疑问题是延迟执行/延迟评估caused by LINQ(请参见备注部分)。当您这样做时:

ServiceInterval

您已经创建了一个IEnumerable,它知道从var data2 = list2.Where(x => x.Id == list1[i].Id); list1[i].Details = data2; 的{​​{1}}返回元素。但是它尚未实际执行该逻辑-只是记住它是“如何”执行的,包括需要引用哪些变量。

它将在稍后实际枚举时执行。问题在于,后来list2变量的值已更改为超出范围的值(因为x.Id == list1[i].Id通过i循环递增,直到超出范围)。

通过在末尾添加i,可以强制for立即执行。这将枚举它,并将内容放入列表中。

有关lambda捕获变量的更多说明,请参见:https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/