先用一個修改過的代碼來示範用法,只來乾的,不來稀的。
/* * Created by SharpDevelop. * User: Owner * Date: 2012-12-14 * Time: 13:43 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */using System;using System.Collections;/// <summary>/// IEnumerable和IEnumrator組合起來使用實現foreach。/// </summary>namespace TestIEnumeratorAndIEnumratable{/// <summary>/// 個體類:這個類儲存了單個體的資訊和一個方法/// </summary>public class 個體{public string 資訊1;public string 資訊2;public 個體(string 資訊1, string 資訊2){this.資訊1 = 資訊1;this.資訊2 = 資訊2;}public void 報數(){Console.WriteLine(this.資訊1 + " = " + this.資訊2);}}/// <summary>/// 集體類:繼承自IEnumerable介面,並提供foreach的可能。/// </summary>public class 集體 : IEnumerable{/// <summary>/// 集體就是一票個體/// </summary>private 個體[] 一票個體;/// <summary>/// 這個集體為了簡便,是有初始的一群個體湊一塊組成的。/// </summary>/// <param name="pArray"></param>public 集體(個體[] pArray){一票個體 = new 個體[pArray.Length];for (int i = 0; i < pArray.Length; i++)一票個體[i] = pArray[i];}/// <summary>/// 介面IEnumerable的實現函數,擷取foreach用到的迭代器/// </summary>/// <returns></returns>public IEnumerator GetEnumerator(){return new 個體指標(一票個體);}}/// <summary>/// 個體指標:針對個體類的迭代器,繼承自IEnumerator。/// 提供了迭代器的走向函數支援。/// </summary>public class 個體指標 : IEnumerator{/// <summary>/// 一票個體的指標/// </summary>public 個體[] 一票個體的指標;/// <summary>/// 迭代器當前位置的指示標誌/// </summary>int 位置 = -1;/// <summary>/// 個體指標的賦值:指向一堆無管理的個體/// </summary>/// <param name="list"></param>public 個體指標(個體[] list){一票個體的指標 = list;}/// <summary>/// 介面IEnumerator的實現函數,迭代器下移。foreach用到,我們不調用。/// </summary>/// <returns></returns>public bool MoveNext(){位置++;return (位置 < 一票個體的指標.Length);}/// <summary>/// 介面IEnumerator的實現函數,迭代器複位。foreach用到,我們不調用。/// </summary>public void Reset(){位置 = -1;}/// <summary>/// 介面IEnumerator的實現函數,擷取當前值。foreach用到,我們不調用。/// </summary>public object Current{get{try{return 一票個體的指標[位置];}catch(IndexOutOfRangeException){throw new InvalidOperationException();}}}}class Program{public static void Main(string[] args){個體[] 個體集合 = new 個體[3]{new 個體("1", "One"),new 個體("2", "Two"),new 個體("3", "Three")};集體 list = new 集體(個體集合);foreach (個體 p in list)p.報數();Console.ReadKey();}}}
上面的樣本很清楚的示範了IEnumerator(迭代器介面)和IEnumerable(遍曆介面)的用法。普遍代表一切。
我想用個體和集體的概念可以更容易理解這個功能。
照我目前理解,單獨的IEnumerator介面沒有任何用處。
IEnumerable介面可以和系統提供的各種繼承自IEnumerator的類(ArrayList,Queue等)來配合,而沒有必要每次都實現。