C# IEnumerable和IEnumrator用法
/* * 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等)来配合,而没有必要每次都实现。