C#笔记——5.迭代器

迭代器(Iterator)简介:
设计模式中的迭代器模式,分离集合对象的遍历行为,抽象出迭代器负责,来做到既不暴露集合的内部结构,又可以让外部代码透明的访问集合内部的数据。
因为迭代器模式应用非常普遍,所以各种编程语言都对迭代器模式进行了封装。

.Net的迭代器实现

IEnumerable接口:


    public interface IEnumerable{
        IEnumerator GetEnumerator();
    }
实现了IEnumerable接口的集合表明该集合能够提供一个Enumerator(枚举器)对象,支持当前的遍历集合。该接口只有一个GetEnumerator()成员方法。

IEnumerator接口:


    public interface IEnumerator{

        object Current{
            get;
        }
        
        bool MoveNext();
    
        void Reset();
    }
MoveNext()方法调整遍历指针移向集合的下一个元素。注意,遍历指针的初始位置是集合中第一个元素的前面。要指向第一个元素,必须先调用一次
MoveNext()方法。该方法返回一个布尔值,如果成功遍历到下一个元素,则返回true;如果指针移出末尾,则返回false。 
Reset()方法用于设置遍历指针指向初始位置,即集合中第一个元素的前面。 
Current属性返回集合中当前对象的引用。 

IEnumerable和IEnumerator的区别:

1、一个Collection要支持foreach方式的遍历,必须实现IEnumerable接口(亦即,必须以某种方式返回IEnumerator object)。

2、IEnumerator object具体实现了迭代器(通过MoveNext(),Reset(),Current)。

3、从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator object就是一个iterator。

4、IEnumerable和IEnumerator通过IEnumerable的GetEnumerator()方法建立了连接,client可以通过IEnumerable的GetEnumerator()得到IEnumerator object,在这个意义上,将GetEnumerator()看作IEnumerator object的factory method也未尝不可。

REF

C#高级编程、C#脚本编程、大话设计模式

猜你喜欢

转载自www.cnblogs.com/sylvan/p/9163993.html