IEnumerator , IEnumerable enumerator interface

IEnumerator means enumerator, IEnumerable means enumerable. Both are interfaces

foreach is a syntactic sugar used to simplify code iterating over enumerable elements. The traversed class implements the traversal function by implementing the IEnumerable interface and a related IEnumerator enumerator.

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() is responsible for getting the enumerator.
MoveNext() is responsible for letting Current get the next value and judging whether the traversal is over.
Current is responsible for returning the value currently pointed to.
Rest() is responsible for resetting the state of the enumerator (not used in foreach).
These are IEnumerable, the basic working principle of IEnumerator.
 

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

Equivalent to

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

 

Detailed explanation of IEnumerable and IEnumerator

Guess you like

Origin blog.csdn.net/qq_42672770/article/details/122977766