none
IEnumerable.GetEnumerator 方法 对实例代码的不解? RRS feed

  • 问题

  •  


    实例代码来自 msdn  , https://msdn.microsoft.com/zh-cn/library/system.collections.ienumerable.getenumerator(v=vs.110).aspx

      public class Program
        {
            public static void Main(string[] args)
            {
                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);


                Console.ReadKey();
            }
        }

        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)
            {
                _people = new Person[pArray.Length];

                for (int i = 0; i < pArray.Length; i++)
                {
                    _people[i] = pArray[i];
                }
            }

            IEnumerator IEnumerable.GetEnumerator()//用来迭代?????
            {
                return (IEnumerator)GetEnumerator();
            }

            public PeopleEnum GetEnumerator()//返回人数?????
            {
                return new PeopleEnum(_people);
            }
        }
        /// <summary>
        /// 支持对非泛型集合的简单迭代
        /// </summary>
        public class PeopleEnum : IEnumerator
        {
            private Person[] _people;

            // 枚举器放置在第一个元素之前,直到调用第一个MoveNext()
            int position = -1;

            public PeopleEnum(Person[] list)//传入一个数组
            {
                _people = list;
            }
            /// <summary>
            /// 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前
            /// </summary>
            /// <returns></returns>
            public bool MoveNext()
            {
                position++;
                return (position < _people.Length);
            }
            /// <summary>
            /// 将枚举数推进到集合的下一个元素
            /// </summary>
            public void Reset()
            {
                position = -1;
            }

            object IEnumerator.Current//写个object 构造器的用意  为什么把 IEnumerator 去掉就与 Current 产生了二义性?????
            {
                get
                {
                    return Current;
                }
            }
            /// <summary>
            ///  获取集合中的当前元素
            /// </summary>
            public Person Current
            {
                get
                {
                    try
                    {
                        return _people[position];
                    }
                    catch (IndexOutOfRangeException)
                    {
                        throw new InvalidOperationException();
                    }
                }
            }
        }

    2015年4月21日 4:09

答案

  • 你好:

    IEnumerable.GetEnumerator()方法返回的是一个枚举器,一个对象想要支持foreach遍历其中的集合元素就要实现IEnumerable接口,这个接口中的GetEnumerator()方法需要被实现,用来返回一个枚举器,也就是IEnumerator的实例。

    >>object IEnumerator.Current

    这个名为Current的属性其实是由接口IEnumerator提供的,PeopleEnum类实现了IEnumerator接口就必须实现这个属性。在这个属性里面执行了PeopleEnum类中的Current方法,返回了Person对象的实例。如果你把IEnumerator.去掉的话,属性名称Current就与方法名称Current重名。

    建议你单步调试一下这个代码就可以清晰的看到执行步骤了。MSDN文档中的解释也非常的清晰。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年4月22日 6:38
    版主