|
|
1
1
这不是一个无限循环的原因是,根据Linq的Take(10)调用的用法,您只需要枚举10次。如果你写的代码是这样的:
现在这是一个无限循环,因为枚举器总是返回一个新值。C#编译器将此代码转换为状态机。如果您的枚举器没有一个guard子句来中断执行,那么调用者必须知道在您的示例中它是这样做的。 代码懒惰的原因也是代码工作的原因。实际上,Take返回第一个项目,然后应用程序使用,然后再使用另一个项目,直到它使用了10个项目。 编辑 这实际上与take的添加无关。这些被称为迭代器。C#编译器对代码执行复杂的转换,从方法中创建枚举数。我建议您仔细阅读它,但基本上(这可能不是100%准确),您的代码将进入Numbers方法,您可以设想初始化状态机。 一旦你的代码命中了一个yield return,本质上就是说Numbers()停止执行,把这个结果还给他们,然后当他们要求下一个项目时,在yield return之后的下一行继续执行。 |
|
|
2
2
这与:
全部的 它的项目,它只是给你下一个项目。它决定了这个项目是什么(例如,有些集合是有序的,有些则不是。有些人不保证有一个特定的顺序,但似乎总是给他们在同一顺序你把他们)。
这10项中的每一项,
其他IEnumerable扩展方法总是遍历每个项。打电话给AsList会把事情搞砸的。使用它大多数LINQ查询都会破坏它。 |
|
|
3
0
|
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
|
Pavel Foltyn · 如何在C中生成逆字典# 1 年前 |
|
ewok · 基于种子和上一个值创建值列表 1 年前 |
|
|
Vasu V · 将foreach转换为select语句 2 年前 |
|
Modest · 使用命名空间和文本值序列化xElement 2 年前 |