IEnumerator和IEnumerable的關系


借鑒了這篇文章,給了俺巨大的幫助啊http://www.cnblogs.com/tnspop/archive/2012/03/15/2397666.html

用自己的話總結一下,便於以后自己的理解:

       IEnumerator與IEnumerable用兩個用來實現枚舉的借口,相互協助來完成創建一個具有枚舉功能的集合。

首先如果是自己定義一個類,里面含有數組元素,然后想對該類進行foreach循環是做不到的,為什么他們arraylist,list等等集合能枚舉,我自己定義的類就不能枚舉呢,關鍵原因是自己的類缺少一個GetEnumerator()方法。

       當用foreach循環來訪問一個對象的時候,其實是默認的調用了對象里面的GetEnumerator()方法。而該方法就是由IEumerable借口給暴露出來的,所以如果想自定義一個能實現枚舉功能的集合類就要先實現一個IEnumerable接口,然后實現里面的GetEnumerator方法。如下所示:

 

namespace Test
{
     class Program
    {
         static  void Main( string[] args)
        {
            Garage car =  new Garage();
             foreach(Car c  in car)
            {
                Console.WriteLine( " {0} is going {1} MPH ", c.Name, c.Age);
            }
            Console.ReadKey();
        }
    }
     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 {  getset; }
         public  int Age {  getset; }
         public Car( string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
}

      看到代碼中的GetEnumerator方法,返回的是一個IEnumerator 接口。這個借口里面才是具體的如何迭代一個集合的方法。但是上面的代碼中我們直接返回了carArray中的這個方法,因為carArray是數組類型,它默認形況下對該IEnumerator中的方法進行了實現。所以這樣可以簡單的實現迭代,當然如果要自定義這個接口中的方法,讓其按照自己的意圖來迭代數據的話,大可返回一個自己寫的實現了IEnumerator的類。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM