IEnumerator , IEnumerable 枚举器接口

IEnumerator是枚举器的意思,IEnumerable是可枚举的意思。这两个都是个接口

foreach是一种语法糖,用来简化对可枚举元素的遍历代码。而被遍历的类通过实现IEnumerable接口和一个相关的IEnumerator枚举器来实现遍历功能。

public class MyList : IEnumerable
{
    public int[] _data = new int[10] { 1, 5, 7, 9, 7, 8, 7, 8, 7, 4 };
 
    public int this[int index]
    {
        get
        {
            return _data[index];
        }
    }
 
    IEnumerator IEnumerable.GetEnumerator()
    {
        Debug.Log("foreach调用  GetEnumerator");
        return new MIEnumtor(this);
    }
}
public class MIEnumtor : IEnumerator
{
    private MyList myList;
 
    private int index;
 
   public  MIEnumtor(MyList my)
    {
        index = -1;
        myList = my;
    }
 
    public object Current
    {
        get
        {
            Debug.Log("foreach调用  Current");
            return myList[index];
        }
    }
 
    public bool MoveNext()
    {
        Debug.Log("foreach调用  MoveNext");
        if (index < myList._data.Length - 1)
        {
            index++;
            return true;
        }
        index = -1;
        return false;
    }
 
    public void Reset()
    {
 
    }
}

GetIEnumerator()负责获取枚举器。
MoveNext()负责让Current获取下一个值,并判断遍历是否结束。
Current负责返回当前指向的值。
Rest()负责重置枚举器的状态(在foreach中没有用到)
这些就是IEnumerable,IEnumerator的基本工作原理了。
 

        MyList my = new MyList();
 
        foreach (var item in my)
        {
            Debug.Log(item);
        }

等价于

        MyList my = new MyList();
 
        MIEnumtor mIEnumtor = my.GetEnumerator();
 
        while (mIEnumtor.MoveNext())
        {
            Debug.Log(mIEnumtor.Current);
        }

IEnumerable和IEnumerator详解_路漫漫其修远兮,吾将上下而求索-CSDN博客

猜你喜欢

转载自blog.csdn.net/qq_42672770/article/details/122977766