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