天天看點

C#_疊代器和枚舉器01

1 IEnumerable 提供可枚舉的能力,隻有實作該接口才可以使用foreach對象疊代對象

其接口包含的方法

IEnumerator GetEnumerator()

該接口中包含實作疊代提供的值序列或者自定義值序列,然後對其進行疊代

public class Test
{
    TestIEnumeratable test = new  TestIEnumerable ()
    IEnumerator item = test.GetEnumerator();//枚舉器隻是提供的一個殼真正實作疊代還疊代器
    while(item.MoveNext())
    {
        Console.WriteLine(item.Current.GetType());
    }
}

public class TestIEnumerable
{
    //這個方法内部就是提前準備好要疊代的對象,自身并不實作疊代
    public IEnumerator GetEnumerator()
    {
        yield return "damon01"
        yield return "damon02"
    }
}

           

該方法體中也可以使用yield建立一個疊代器然後傳回

public class TestIEnumerable:IEnumerable
{
    IEnumerator GetEnumerator()
    {
        yield return 1; //這裡通過yield 建立疊代器并且傳回1 和2的值序列
        yield return 2; 
    }
}

           

直接傳回一個自定義的疊代器類

public class TestIEnumerable:IEnumerable
{
    IEnumerator GetEnumerator()
    {
        return new TestIEnumerator(); //這裡直接傳回的就是一個自定義的疊代器
    }
}

public TestIEnumerator:IEnumerator
{
    public TestIEnumerator()
    {
        
    }
    
    ......
}
           
2 IEnumerator 提供可以疊代的值序列,供枚舉器使用

包含普通接口IEnumerator和泛型接口IEnumerator

其接口方法包含

bool MoveNext() //這裡的MoveNext可以自定義傳回滿足的條件true

Object Current

void Reset()
           
比較經典的用法

public class HelloIEnumerator : IEnumerator, IEnumerator<string>
{
    private int m_State;
    private string current;
    public HelloIEnumerator(int state)
    {
        this.m_State = state;
    }

    object IEnumerator.Current
    {
        get { return current; }
    }
    string IEnumerator<string>.Current
    {
        get { return current; }
    }

    public void Dispose()
    {
    }

    public bool MoveNext()
    {
        switch (m_State)
        {
            case 0:
                m_State = 1;
                current = "Hello";
                return true;
            case 1:
                m_State = 2;
                current = "world";
                return true;
            case 2:
                break;
        }
        return false;
    }

    public void Reset()
    {
        m_State = 0;
        current = "";
    }
}
           
public class GameMove
{
    public IEnumerator cross;
    private IEnumerator circle;

    private int moveStemp = 0;
    public GameMove()
    {
        this.cross = Cross();
        this.circle = Circle();
    }
    public IEnumerator Cross()
    {
        while (moveStemp++ < 9)
        {
            string temp = "cross: moveStemp"+moveStemp;
            Console.WriteLine(temp);
            yield return circle;
        }
    }
    public IEnumerator Circle()
    {
        while (moveStemp++ < 9)
        {
            string temp = "circle: moveStemp" + moveStemp;
            Console.WriteLine(temp);
            yield return cross;
        }
    }
}