迭代器模式能够获取到序列中的所有元素而不用关心其类型是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