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