所有阵列插槽均包含最后一个结果

时间:2019-07-11 08:46:31

标签: c# arrays lambda

我很确定这已经被问过了,但我不知道要搜索什么:

我想用在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));
}

问题在于数组中的每个项目最终都包含相同的项目(可能是循环中的最后一个结果)。

如何避免这种情况?

2 个答案:

答案 0 :(得分:3)

问题在于此代码将表达式保存在每个数组元素中,而不是“物化”集合中。同时,由于关闭,所有保存的表达式都“链接”到相同的i值。这就是为什么您获得最后的价值。

只需通过以下方式进行更改:

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

答案 1 :(得分:2)

好像,您的循环变量被捕获。尝试这样做:

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

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