借鑒了這篇文章,給了俺巨大的幫助啊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 { get; set; }
public int Age { get; set; }
public Car( string name, int age)
{
Name = name;
Age = age;
}
}
}
{
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 { get; set; }
public int Age { get; set; }
public Car( string name, int age)
{
Name = name;
Age = age;
}
}
}
看到代碼中的GetEnumerator方法,返回的是一個IEnumerator 接口。這個借口里面才是具體的如何迭代一個集合的方法。但是上面的代碼中我們直接返回了carArray中的這個方法,因為carArray是數組類型,它默認形況下對該IEnumerator中的方法進行了實現。所以這樣可以簡單的實現迭代,當然如果要自定義這個接口中的方法,讓其按照自己的意圖來迭代數據的話,大可返回一個自己寫的實現了IEnumerator的類。