Contents

迭代器

迭代器

  • 迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式
  • 而迭代器模式提供一个方法顺序 访问一个聚合对象中的各个元素 而又不暴露其内部的标识
  • 是可以在容器对象上遍历访问的接口 设计人员无需关心容器对象的内存分配的实现细节
  • 可以用foreach遍历的类 都是实现了迭代器的

标准迭代器的实现方法

  • 可通过实现IEnumerator和IEnumerable这两个接口 来实现迭代器
  • 需要引用命名空间 System.Collections
class CustomList : IEumerable,IEnumerator{
    private int[] list;
    private int index = -1;
    public CustomList(){
        list = {1,2,3,4,5,6,7,8,9};
    }
    //只要实现了IEumerable接口 Foreach就不会报错
    public IEnumerator GetEnumerator(){
        Reset();
        return this;
    }
    //IEnumerator接口的方法
    //代表当前的元素
    public object Current => list[index];
    public void Reset(){
        index = -1;
    }
     public bool MoveNext(){
        index++;
        return lsit.Length>index;
     }    
}

foreach本质

  1. 先调用in后面这个对象里面 通过IEumerable接口实现的GetEnumerator方法
  2. 执行得到的IEnumerator对象中的MoveNext方法
  3. 只要MoveNext方法的返回值是true 就会去得到Current 赋值给item
  4. 遍历结束后会调用Reset方法 重置index
foreach(var item in CustomList){
    Console.WriteLine(item);//1 2 3 4 5 6 7 8 9
}

通过语法糖来实现迭代器

  • 语法糖的主要作用 就是将复杂逻辑简单化,可以增加程序的可读性
  • 程序内部会自动生成IEnumerator
class CustomList : IEumerable{
    private int[] list;
    private int index = -1;
    public CustomList(){
        list = {1,2,3,4,5,6,7,8,9};
    }
    //只要实现了IEumerable接口 Foreach就不会报错
    public IEnumerator GetEnumerator(){
        for(int i =0;i<list.Length;i++){
            //yield关键字 配合迭代器使用的
            //可以理解为 暂时返回 保留当前状态
            //C#语法糖
            yield return list[i];
        }
    }  
}