【发布时间】:2017-09-21 10:36:46
【问题描述】:
我有以下方法:
private static List<List<job>> SplitJobsByMonth(IEnumerable<job> inactiveJobs)
{
List<List<job>> jobsByMonth = new List<List<job>>();
DateTime cutOff = DateTime.Now.Date.AddMonths(-1).Date;
cutOff = cutOff.AddDays(-cutOff.Day + 1);
List<job> temp;
while (inactiveJobs.Count() > 0)
{
temp = inactiveJobs.Where(j => j.completeddt >= cutOff).ToList();
jobsByMonth.Add(temp);
inactiveJobs = inactiveJobs.Where(a => !temp.Contains(a));
cutOff = cutOff.AddMonths(-1);
}
return jobsByMonth;
}
它旨在按月拆分工作。 'job' 是一个类,而不是一个结构。在 while 循环中,传入的 IEnumerable 在每次迭代时都会重置,以移除已处理的作业:
inactiveJobs = inactiveJobs.Where(a => !temp.Contains(a));
通常这会大大减少此集合的内容。但是,在下一次迭代中:
temp = inactiveJobs.Where(j => j.completeddt >= cutOff).ToList();
将 inactiveJobs 对象恢复到它被传递到方法时的状态 - 所以集合再次满了。 我已经通过稍微重构这个方法解决了这个问题,但是我很好奇为什么会出现这个问题,因为我无法解释它。谁能解释为什么会这样?
【问题讨论】:
-
在
inactiveJobs = inactiveJobs.Where(a => !temp.Contains(a));行添加 ToList 或 ToArray 解决了问题? -
我认为这是由 linq 的延迟执行引起的。因此,当使用
Where时,您实际上并没有执行 查询,而只是定义 它。只需像之前的行一样使用Where(...).ToList()。 -
stackoverflow.com/help/mcve - 如果您可以向我们展示具有预期输出的完整示例,我们可以帮助您转向该解决方案。
-
添加 ToList() 修复了它。谢谢。
标签: c# linq ienumerable