c#迭代器IEnumerable(2021-3-26)

迭代器模式能够获取到序列中的所有元素而不用关心其类型是array,list,linked list或者是其他什么序列结构,能够非常高效地构建数据处理通道,即数据能够进入处理通道,经过一系列的变换,或者过滤,然后得到结果,这是LINQ的核心模式。在.c#中,常使用关键字foreach实现对集合(类)的遍历,但不是每一个类都可以使用foreach关键字进行遍历。
如:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里的foreach语句并不能实现对carLot对象中的carLot.carArray[]的遍历。想要实现必须采用迭代器模式。

迭代器模式被IEnumerator和IEnumerable及其对应的泛型接口所封装。
IEnumerable接口只包含一个抽象的方法GetEnumerator(),返回值为IEnumerator对象:
在这里插入图片描述

IEnumberator接口的定义了一个Current属性(获取集合中的当前元素),
MoveNext方法(将浮标的内部位置移动到下一个元素)
和Reset方法:
在这里插入图片描述
如果一个类实现了IEnumerable接口,那么就能够被迭代,调用GetEnumerator方法将返回IEnumerator接口的实现,它就是迭代器本身。迭代器类似于数据库中的浮标,是数据库列中的一个位置记录,迭代器只能向前移动,同一数据序列中可以有多个迭代器同时对数据进行操作。
使用模式(实现对上述carLot对象中的carLot.carArray[]的遍历):
(1)继承IEnumerable接口的 ForeachTest类 ,且包含GetEnumerator():
在这里插入图片描述
(2)定义继承IEnumerator接口的ForeachTestEnumerator类:
在这里插入图片描述
(3)使用foreach语句:
在这里插入图片描述
(4)也可以通过使用yield return语句,我们可以替换掉整个IEnumerator类。yield return语句就是告诉编译器,要实现一个迭代器块。
上述代码可简化为:
在这里插入图片描述
在这里插入图片描述
foreach语句与实现IEnumerable接口和IEnumerator接口的类如何产生联系的原理并不清楚,但需清楚一个类按如上方法继承实现类迭代器模式就可以使用foreach语句遍历。

(5)也可以将类定义为泛型集成IEnumerable和IEnumerator

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值