您可以使用它yield
来构建任何迭代器。这可能是一个懒惰评估的系列(例如,从文件或数据库中读取行,而不是一次读取所有内容,这可能太多而无法保存在内存中),或者可能正在迭代现有数据,例如List<T>
.
C# in Depth有一个免费的第 (6) 章是关于迭代器块的。
我最近还写了一篇关于使用智能蛮力算法的博客。yield
对于惰性文件阅读器的示例:
static IEnumerable<string> ReadLines(string path) {
using (StreamReader reader = File.OpenText(path)) {
string line;
while ((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
这完全是“懒惰”;在您开始枚举之前什么都不会被读取,并且只有一行被保存在内存中。
请注意,LINQ-to-Objects广泛使用了迭代器块 ( yield
)。例如,Where
扩展本质上是:
static IEnumerable<T> Where<T>(this IEnumerable<T> data, Func<T, bool> predicate) {
foreach (T item in data) {
if (predicate(item)) yield return item;
}
}
再一次,完全懒惰 - 允许您将多个操作链接在一起,而无需强制将所有内容加载到内存中。