今天突然看到这个问题,找了些资料汇总一下,希望对大家有帮助
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也未尝不可。
MSDN上的例子,大家以后遇到问题可以先去MSDN上找找我觉得微软自己的东西,自己最了解。
- 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
- *
- */