首页 > 代码库 > 12.1.2 在 C# 中使用迭代器
12.1.2 在 C# 中使用迭代器
12.1.2 在 C# 中使用迭代器
当C# 2.0 最初引入迭代器时,最常见的用途是为了使自己集合的 IEnumerable<T> 接口的实现更简单。在 C# 中使用的编程风格已经有了演变,现在迭代器能与其它函数式结构一起使用,进行各种数据处理操作。
迭代器可以用来生成任意序列。我们先从一个简单的示例开始,生成阶乘小于一百万的序列,并格式化成字符串形式。清单 12.1 显示了完整的源代码。
清单 12.1 用迭代器生成阶乘(C#)
static IEnumerable<string>Factorials() {
intfactorial = 1; [1]
for(int num = 0; factorial < 1000000; num++) {
factorial = factorial * num; [2]
yield return String.Format("{0}! = {1}", num, factorial); <-- 返回下一个字符串
}
}
C# 编译器对迭代器代码执行相当复杂的转换,创建实现 IEnumerable<T> 接口的“隐藏”类型。清单 12.1 中重要的地方在于处理局部状态。我们声明一个局部变量[1],保存一些可变状态,另一个可变变量声明为 for 循环的一部分。算法在循环内实现,当我们每次想从迭代器中取出另一个值时,都会执行,循环体更新迭代器的局部状态[2],并生成新的计算值。
代码完全是命令式的,因为严重依赖于变量,但从迭代器的外部来看,几乎就像是函数式的数据类型,因为可变状态都隐藏了。现在,我们要看一下序列表达式(sequence expression),F# 通常来生成、处理序列。
12.1.2 在 C# 中使用迭代器