C# IEnumerable和IEnumerator的区别,如何实现


对比

IEnumerable接口和IEnumerator接口是.NET中非常重要的接口,二者有何区别?

简单来说IEnumerable是一个声明式的接口,声明实现该接口的类就是“可迭代的enumerable”,但并没用说明如何实现迭代器(iterator).

其代码实现为:

public interface IEnumerable
{
    IEnumerator GetEnumerator();
}

而IEnumerator接口是实现式接口,它声明实现该接口的类就可以作为一个迭代器iterator.

其代码实现为:

public interface IEnumerator
{
    object Current { get; }

    bool MoveNext();
    void Reset();
}

使用

一个 Collection 要支持 Foreach 进行遍历,就必须实现 IEnumerable ,并一某种方式返回迭代器对象: IEnumerator .

那么又如何实现这两个接口呢? 其代码如下:

假设有一个Person类,其有两个属性FirstName和LastName

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Person(string firstName, string lastName)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
    }
}

另外通过People类来实现IEnumerable和IEnumerator接口.

//实现IEnumerable接口
public class People :IEnumerable
{

    public Person [] pers;

    public People(Person [] ps)
    {
        this.pers = ps;
    }

    public IEnumerator GetEnumerator()
    {

        //foreach(Person p in pers)
        // {

            //  yield return p;

        // }

        return new People1(pers);

    }

}

//实现IEnumerator接口
public class People1 : IEnumerator
{
    public Person[] pers;
    public People1(Person[] per)
    {
        this.pers = per;
    }
    int position = -1;

    public bool MoveNext()
    {
        position++;
        return position < pers.Length;
    }
    public void Reset()
    {
        position=-1;
    }
    public object Current
    {
        get
        {
            try
            {
                return pers[position];
            }
            catch(IndexOutOfRangeException ex)
            {
                throw new InvalidOperationException();
            }
        }
    }
}

知识共享许可协议
《C# IEnumerable和IEnumerator的区别,如何实现》 常伟华 创作。
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议 | 3.0 中国大陆许可协议进行许可。

站内公告