Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# 使用foreach在IEnumerable上迭代会跳过一些元素_C#_Ienumerable - Fatal编程技术网

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
。但这只是因为它会根据需要逐个评估每个项目。这称为延迟执行,通常用于优化大型查询或长时间运行的动态大小的操作