yield return 返回迭代器

时间:2021-04-10 23:30:35
 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;
                }

            }
        }