C# 所有阵列插槽都包含最后一个结果
我很确定以前有人问过这个问题,但我不知道该搜索什么: 我想用在lambda表达式中找到的内容填充数组。 我这样做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
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数组被多次遍历,结果将不一样。如果将表达式留在数组中,它们将被反复执行-可能会影响性能并产生一些副作用。