我将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]);
}
答案 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/