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# 中使用迭代器

上一篇:基于SpringBoot搭建一个带数据库访问的WEB项目(记录所需的依赖,配置,驱动安装等注意事项)


下一篇:MySQL 管理