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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章