12.1.2 在 C# 中使用迭代器

728 篇文章 1 订阅
349 篇文章 0 订阅

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# 通常来生成、处理序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值