Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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# 所有阵列插槽都包含最后一个结果_C#_Arrays_Linq_Lambda - Fatal编程技术网

C# 所有阵列插槽都包含最后一个结果

C# 所有阵列插槽都包含最后一个结果,c#,arrays,linq,lambda,C#,Arrays,Linq,Lambda,我很确定以前有人问过这个问题,但我不知道该搜索什么: 我想用在lambda表达式中找到的内容填充数组。 我这样做 IEnumerable<CapOrderTimeSlot>[] dummyDates = new IEnumerable<CapOrderTimeSlot>[DayCount]; for (int i=0; i< DayCount; i++) { dummyDates[i] = OrderSlots.Where(os => os.Comp

我很确定以前有人问过这个问题,但我不知道该搜索什么:

我想用在lambda表达式中找到的内容填充数组。 我这样做

IEnumerable<CapOrderTimeSlot>[] dummyDates = new IEnumerable<CapOrderTimeSlot>[DayCount];

for (int i=0; i< DayCount; i++)
{
    dummyDates[i] = OrderSlots.Where(os => os.ComputedStartDate == FirstDate.AddDays(i));
}
IEnumerable[]dummyDates=新的IEnumerable[DayCount];
对于(int i=0;ios.ComputedStartDate==FirstDate.AddDays(i));
}
问题是数组中的每个项最终都包含相同的项(可能是循环中的最后一个结果)


如何避免这种情况?

循环变量
I
Linq
方法捕获。尝试将其分配给循环内的局部变量:

IEnumerable[]dummyDates=新的IEnumerable[DayCount];
对于(int i=0;ios.ComputedStartDate==FirstDate.AddDays(temp));
}

这篇文章很好地解释了这个问题

问题在于,这段代码在每个数组元素中保存表达式,而不是“物化”集合。同时,由于闭包,所有保存的表达式都“链接”到相同的i值。这就是您获取最后一个值的原因

就这样改变吧:

for (int i=0; i< DayCount; i++)
{
    dummyDates[i] = OrderSlots.Where(os => os.ComputedStartDate == FirstDate.AddDays(i)).ToArray();
}
for(int i=0;ios.ComputedStartDate==FirstDate.AddDays(i)).ToArray();
}

你所说的“可能是循环中的最后一个结果”是什么意思?你怎么能不确定这是不是最后的结果?要么是,要么不是。您是否故意选择了
IEnumerable
?是否打算在每次访问
dummyDates
中的元素时执行查询?是否要更改
订单槽
?因此,您可以在运行时动态地对更改做出反应?这与仅使用i有什么不同?i变量在linq执行后被捕获和计算。对于循环中的局部变量,每次都会对其进行计算,最好使用.Single,而不是ToArray。。但这取决于OP@TonyAbrams为什么是单曲?帖子显示了
IEnumerable[]
它需要一个collections@Mong朱。。。哎哟,完全没有注意到:)如果以后的dummyDates数组被多次遍历,结果将不一样。如果将表达式留在数组中,它们将被反复执行-可能会影响性能并产生一些副作用。