public class Person { public string firstName; public string lastName; public int age; public Person(string fName, string lName, int age) { this.firstName = fName; this.lastName = lName; this.age = age; } } 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() { for (int i = 0; i < _people.Length; i++) //int i = _people.Length - 1; i >= 0; --i { yield return _people[i]; } } } 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 Program { static void Main(string[] args) { Person[] peopleArray = new Person[3] { new Person("John", "Smith",9), new Person("Jim", "Johnson",6), new Person("Sue", "Rabon",90) }; People peopleList = new People(peopleArray); //People yongPeople; //foreach //不使用yield return的查找小10岁的算法 List<Person> allPerson = new List<Person>(); allPerson.AddRange( new Person[3] { new Person("John", "Smith",9), new Person("Jim", "Johnson",6), new Person("Sue", "Rabon",90) } ); List<Person> less10Person = new List<Person>(); foreach(Person p in allPerson) { if (p.age < 10) { less10Person.Add(p); } } foreach (Person p in less10Person) { Console.WriteLine(p.firstName + "." + p.lastName); } Console.WriteLine("-----------------------"); //使用yield return查找年龄小于多少的集合。 IEnumerable children = GetPeopleByAge(peopleList, 10); foreach (Person p in GetPeopleByAge(peopleList, 10)) { Console.WriteLine(p.firstName + "." + p.lastName); } } private static IEnumerable GetPeopleByAge(People peopleList, int age) { foreach (Person p in peopleList) { if (p.age < age) { yield return p; } } }