C# 使用foreach在IEnumerable上迭代会跳过一些元素
我遇到了在C# 使用foreach在IEnumerable上迭代会跳过一些元素,c#,ienumerable,C#,Ienumerable,我遇到了在enumerable上迭代和在enumerable.ToList()上迭代的行为差异 由于这是压缩代码,大多数函数并不完全符合它们的要求。如果您想进一步削减,可以使用共享代码() 我将MSVS 2013(12.0.30110.00更新1)与.NET Framework v4.5.51650一起使用调用ToList()将在查看该时间点时实现对项目的最终选择。在一个IEnumerable上迭代将对每个项目的表达式求值,并逐个生成它们,因此在迭代之间现实可能会发生变化。事实上,这很可能发生,
enumerable
上迭代和在enumerable.ToList()上迭代的行为差异
由于这是压缩代码,大多数函数并不完全符合它们的要求。如果您想进一步削减,可以使用共享代码()
我将MSVS 2013(12.0.30110.00更新1)与.NET Framework v4.5.51650一起使用调用ToList()
将在查看该时间点时实现对项目的最终选择。在一个IEnumerable
上迭代将对每个项目的表达式求值,并逐个生成它们,因此在迭代之间现实可能会发生变化。事实上,这很可能发生,因为您在迭代之间更改了项的属性
在迭代的主体中,设置
CellsWithShips[point.X, point.Y] = false;
在选择方法时,可以查询
things.Where(p => CellsWithShips[p.X, p.Y]);
这意味着这样一个查询的固有动态结果将会改变,因为您已经将其中一些结果设置为false
。但这只是因为它会根据需要逐个评估每个项目。这称为延迟执行,最常用于优化大型查询或长时间运行的动态大小的操作。调用ToList()
将在查看该时间点时实现最终的项目选择。在一个IEnumerable
上迭代将对每个项目的表达式求值,并逐个生成它们,因此在迭代之间现实可能会发生变化。事实上,这很可能发生,因为您在迭代之间更改了项的属性
在迭代的主体中,设置
CellsWithShips[point.X, point.Y] = false;
在选择方法时,可以查询
things.Where(p => CellsWithShips[p.X, p.Y]);
这意味着这样一个查询的固有动态结果将会改变,因为您已经将其中一些结果设置为false
。但这只是因为它会根据需要逐个评估每个项目。这称为延迟执行,通常用于优化大型查询或长时间运行的动态大小的操作