IEnumerable和IEnumerator區別

1、一個Collection要支持foreach方式的遍歷,必須實現IEnumerable接口(亦即,必須以某種方式返回IEnumerator object)。


2、IEnumerator object具體實現了iterator(通過MoveNext(),Reset(),Current)。

3、從這兩個接口的用詞選擇上,也可以看出其不同:IEnumerable是一個聲明式的接口,聲明實現該接口的class是“可枚舉(enumerable)”的,但並沒有說明如何實現枚舉器(iterator);IEnumerator是一個實現式的接口,IEnumerator object就是一個iterator。

4、IEnumerable和IEnumerator通過IEnumerable的GetEnumerator()方法建立了連接,client可以通過IEnumerable的GetEnumerator()得到IEnumerator object,在這個意義上,將GetEnumerator()看作IEnumerator object的factory method也未嘗不可。

實例程序:

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);

    }

}

/* This code produces output similar to the following:

*

* John Smith

* Jim Johnson

* Sue Rabon

*

*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章