迭代器

迭代器

迭代器是程序设计的软件设计模式

迭代器模式提供一个方法顺序访问一个聚合对象中的各个元素而不暴露其内部的标识

在表现效果上看是可以在容器对象上遍历访问的接口

设计人员无需关心容易对象内存分配的实现细节

可以用foreach遍历的类都是实现了迭代器的


标准迭代器的实现方法

//关键接口:IEnumerator,IEnumrable
//可通过同时继承两个接口实现其中的方法
class CustomList : IEnumerable,IEnumerator
{
    private int[] list;
    //从-1开始的光标用于表示数据走到了哪个位置
    private int position = -1;
    public CustomList()
    {
        list = new int[]{1,2,3,4,5,6,7,8};
    }
    //IEnumerable接口
    public IEnumerator GetEnumerator()
    {
        Reset();
        return this;
    }
    //IEnumerator接口
    public object Current 
    {
        get
        {
            return list[position];
        }
    }
    public bool MoveNext()
    {
        //移动光标
        ++position;
        //是否溢出
        return position < list.Length;
    }
    //重置光标位置,一般写到IEnumerator函数中
    public void Reset()
    {
        position = -1;
    }
}
CustomList List = new CustomList();
//foreach本质
//1.先获取in后面这个对象的IEnumerator
//会调用对象其中的GetEnumerator方法来获取
//2.执行得到这个IEnumerator对象中的MoveNext方法
//3.只要MoveNext方法的返回值是true就会去得到Current
//然后赋值给item
foreach (int item in list)
{
    Console.WriteLine(item);
}
//用yield return语法糖实现迭代器
//所谓语法糖也称为糖衣语法
//主要作用就是将复杂逻辑简单化,可以增加程序的可读性
//关键接口:IEnumerable
//让想要通过foreach遍历的自定义类实现接口中的GetEnumerator即可
class CustomList2 : IEnumerable
{
    private int[] list;
    public CustomList2()
    {
        list = new int[]{1,2,3,4,5,6,7,8};
    }
    public IEnumerator GetEnumerator()
    {
        for(int i =0;i<list.Length;i++)
        {
            //yield关键字配合迭代器使用
            //可以理解为暂时返回保留当前状态
            yield return list[i];
        }
    }
}
//用yield return为泛型类实现迭代器
class CustomList<T>:IEnumerable
{
    private T[] array;
    public CustomList(params T[] array)
    {
        this.array=array;
    }
    public IEnumerator GetEnumerator()
    {
        for (int i = 0;i<array.Length;i++)
        {
            yield return array[i];
        }
    }
}
posted @ 2025-03-14 20:47  cannedmint  阅读(52)  评论(0)    收藏  举报