Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# For循环在完成并返回ArgumentOutOfRangeException后重复_C#_For Loop_Repeat - Fatal编程技术网

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

C# For循环在完成并返回ArgumentOutOfRangeException后重复,c#,for-loop,repeat,C#,For Loop,Repeat,我正在将foreach传递给for以提高性能。然而,我认为我的for很好,但是,在它运行之后,我不知道为什么它上次又重复了1次(即使它与句子不对应),它抛出错误,因为“I”不存在于该列表中 我已经搜索过了,但没有人有这个错误,所以我很好奇。我的意思是,情况很好,它“第一次”工作正常,但后来,它又不知从哪里跑了起来,然后又坏了 这可能是因为我正在为列表1执行ToList()?因为调用数据库会返回一个IEnumerable,而我不能将它用于for循环 var list1 = GetData1

我正在将foreach传递给for以提高性能。然而,我认为我的for很好,但是,在它运行之后,我不知道为什么它上次又重复了1次(即使它与句子不对应),它抛出错误,因为“I”不存在于该列表中

我已经搜索过了,但没有人有这个错误,所以我很好奇。我的意思是,情况很好,它“第一次”工作正常,但后来,它又不知从哪里跑了起来,然后又坏了

这可能是因为我正在为列表1执行ToList()?因为调用数据库会返回一个IEnumerable,而我不能将它用于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]);
        }
var list1=GetData1FromDB().ToList();
var list2=GetData2FromDB();
for(inti=0;ix.Id==list1[i].Id);
列表1[i]。详细信息=数据2;
result.data1.Add(列表1[i]);
}

我怀疑问题在于执行延迟/延迟评估(请参见备注部分)。执行此操作时:

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

它将在稍后执行,当某些东西实际尝试枚举它时。问题是以后,
i
变量的值变为超出范围的值(因为
i
for
循环递增,直到超出范围)

通过在末尾添加
.ToList()
,可以强制执行
IEnumerable
。这将枚举它并将内容放入列表中


有关lambdas捕获变量的更多说明,请参阅:

我无法真正理解问题所在。确切的错误是什么,是哪一行抛出的?它在这一行中中断var data2=list2.Where(x=>x.Id==list1[i].Id);因为list1.Count是6,当i<6时,它运行正常,但是在运行foreach并将帖子返回到web之后。。。代码从那一行的任何地方断开,因为我现在是6,列表从0变为5
i好的,我已经改变了所有这些,但是错误仍然存在。因此,我建议将
list2
内容添加到字典中,以提高速度
var dict=GetData2FromDB().ToDictionary(x=>x.Id)然后,在循环中:
list1[i].Details=dict[list1[i].Id]。这是O(n)。列表变量是O(n^2)。是的,这解决了我的问题!谢谢你们。谢谢你的信息!