IEnumerable和IEnumerator的关系

View Code
using System;
using System.Collections;

public class Person
{
    public Person(string fName, string lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }

    public string firstName;
    public string lastName;
}

public class People : IEnumerable
{
    private Person[] _people;
    public People(Person[] pArray)
    {
        _people = new Person[pArray.Length];

        for (int i = 0; i < pArray.Length; i++)
        {
            _people[i] = pArray[i];
        }
    }

    public IEnumerator GetEnumerator()
    {
        return new PeopleEnum(_people);
    }
}

public class PeopleEnum : IEnumerator
{
    public Person[] _people;

    // Enumerators are positioned before the first element
    // until the first MoveNext() call.
    int position = -1;

    public PeopleEnum(Person[] list)
    {
        _people = list;
    }

    public bool MoveNext()
    {
        position++;
        return (position < _people.Length);
    }

    public void Reset()
    {
        position = -1;
    }

    public object Current
    {
        get
        {
            try
            {
                return _people[position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
}

class App
{
    static void Main()
    {
        Person[] peopleArray = new Person[3]
        {
            new Person("John", "Smith"),
            new Person("Jim", "Johnson"),
            new Person("Sue", "Rabon"),
        };

        People peopleList = new People(peopleArray);
        foreach (Person p in peopleList)
            Console.WriteLine(p.firstName + " " + p.lastName);

    }
}


上面的代码是msdn中的源码。

经常被问到对IEnumerable和IEnumerator的认识。。。

也一直知道是为了实现迭代、foreach...

那么到底是干什么的呢?

到目前为止,理解到:我定义一个类型(类),实例化了一系列对象,一般情况下,我们会放到一个List<T>里,那么这个集合,是支持foreach操作的。

如果,我是说如果,我们不放在现有的集合里,而是放在一个数组里T[],那么如果我还想迭代之,如何做呢?

答案就是这两个东西:支持在非泛型集合上执行简单迭代。

IEnumerable里就一个方法,返回IEnumerator类型的对象;

public IEnumerator GetEnumerator()

IEnumerator里有三个方法需要实现。

MoveNext

Reset

Current

具体实现,请参考顶部代码,我觉得写得结构非常清晰了。

至于在应用中的具体应用,还没想到场景,希望您不吝赐教。

原文地址:https://www.cnblogs.com/xyang/p/3022349.html