天天看點

C# IEnumerator和IEnumerable了解

IEnumerator和IEnumerable是 .NET内置的接口,用來為集合類添加周遊的功能。然而兩者高在一起,讓我剛開始學習時頭痛不已。檢視MSDN和網上資料後,将自己的收獲整理下來:

   看着兩者的英文名,我們大概可以猜一下:

          IEnumerable的實作标志該類具有了枚舉的能力,并且在适當的時機可以傳回疊代器。它隻有一個GetEnumerator() 

IEnumerator GetEnumerator();
           

          IEnumerator的實作标志着該類具有疊代器的功能,并且允許繼承該接口的類制定自己的疊代規則,它有:     

object Current{get;} //傳回目前位置的元素
          bool MoveNext()      //移動到下一個元素;
          void Reset()         //重置疊代位置到開始處
 
           

             為了疊代,我們必須需要一個辨別目前疊代位置的字段,是以請再為疊代器添加一個index的字段吧。

             index初始值為-1,MoveNext() 就是調整index的值,将疊代的位置向後移動,當超出界限時傳回False,表示疊代結束,否則為True;

-----------------------------------------------分割線---------------------------------------------------------

         下面通過一個例子了解一下:

           Person類

public  class Person
      {
        public string FirstName { get; set; }
        public string LastName { get; set; }
      }
           

         People類 (繼承自IEnumerable 包含一個People類型的數組)

class People : IEnumerable
    {
        private Person[] pers;

        public People(Person[] pers)
        {
            this.pers = pers;
        }

        public IEnumerator GetEnumerator()
        {
            return new PeopleEnum(pers);
        }
    }
           

        PeopleEnum類(繼承IEnumerator用于産生疊代)

class PeopleEnum : IEnumerator
    {
        private  int index = -1;
        private Person[] pers;

        public PeopleEnum(Person [] pers)
        {
            this.pers=pers;
        }

        public object Current
        {
            get
            {
                try
                {
                    return pers[index];
                }
                catch(Exception e)
                {
                    throw e;
                }
            }
        }

        public bool MoveNext()
        {
            return ++index < pers.Length;
        }

        public void Reset()
        {
            index = -1;
        }
    }
           

      主函數測試

public class Test
    {

        static void Main()
        {
            Person[] pers = { new Person { FirstName = "A", LastName = "a" }, new Person { FirstName = "B", LastName = "b" }  };
            
            People peo = new People(pers);

            IEnumerator enrator = peo.GetEnumerator();
            while (enrator.MoveNext())
            {
                Console.WriteLine( ((Person)enrator.Current ).FirstName +"::"+((Person)enrator.Current).LastName);
            }

        }
    }
           

        請注意,PeopleEnum繼承自IEnumerator,是以可以類型轉換為IEnumberator。

        在主函數中,先生成一個Person數組,然後用這個數組初始化一個People的對象,因為People實作了IEnmerable是以它能夠疊代枚舉,并可以傳回一個枚舉器IEnumerator,而不巧的是,IEnumerable接口并沒有包含怎麼實作疊代,是以還需要繼承自IEnumberator的PeopleEnum類來産生一個疊代器。

這樣一切就都具備了,開始While循環疊代People集合。

   運作結果:

C# IEnumerator和IEnumerable了解