using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IENumerable_Test { public class Person { public string firstName; public string lastName; public Person(string fName, string lName) { this.firstName = fName; this.lastName = lName; } } public class People : IEnumerable { private Person[] _people; public People(Person[] pArray) { this._people = pArray; //_people = new Person[pArray.Length]; //for (int i = 0; i < pArray.Length; i++) //{ // _people[i] = pArray[i]; //} } // Implementation for the GetEnumerator method. IEnumerator IEnumerable.GetEnumerator() { return (IEnumerator)GetEnumerator(); } //IEnumerator IEnumerable.GetEnumerator() // { // throw new NotImplementedException(); // } public PeopleEnum 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) { this._people = list; } public bool MoveNext() { position++; return (position < _people.Length); } public void Reset() { position = -1; } object IEnumerator.Current { get { return Current; } } public Person Current { get { try { return _people[position]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } } class Program { static void Main(string[] args) { Person[] peopleArray = { 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); Console.ReadKey(); } } }
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace test { class Program { static void Main(string[] args) { Console.WriteLine("*********Fun with IEnumberable/IEnumerator************ "); Garage carLot = new Garage(); //交出集合中的每一Car对象吗 foreach (Car c in carLot) { Console.WriteLine("{0} is going {1} MPH", c.Name, c.Speed); } Console.WriteLine("GetEnumerator被定义为公开的,对象用户可以与IEnumerator类型交互,下面的结果与上面是一致的"); IEnumerator i = carLot.GetEnumerator(); while(i.MoveNext()) { //i.current返回值类型是object的 Car myCar = (Car)i.Current; Console.WriteLine("{0} is going {1} MPH", myCar.Name, myCar.Speed); } Console.ReadLine(); } } public class Garage : IEnumerable { Car[] carArray = new Car[4]; //在Garage中定义一个Car类型的数组carArray,其实carArray在这里的本质是一个数组字段 //启动时填充一些Car对象 public Garage() { //为数组字段赋值 carArray[0] = new Car("Rusty", 30); carArray[1] = new Car("Clunker", 50); carArray[2] = new Car("Zippy", 30); carArray[3] = new Car("Fred", 45); } public IEnumerator GetEnumerator() { //递归调用 return this.carArray.GetEnumerator(); } } public class Car { public string Name { get; set; } public int Speed { get; set; } public Car(string name, int speed) { this.Name = name; this.Speed = speed; } } }