一、借助已经实现迭代的类来完成对某类的迭代器
一般情况下想通过foreach来枚举某一个类里包含的类容则必须实现枚举接口IEnumerable 然后重新写GetEnumerator方法。 创建的时候讲要加载的内容放进已经实现枚举的数组或类中,然后返回数组或此类中的GetEnumerator方法,这样比较简单。如下所示
class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); // TODO: Implement Functionality Here Class classs=new Class(); foreach(int item in classs) { Console.WriteLine(""+item); } Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } public class Class:IEnumerable { int[] myselfdata=new int[]{1,2,3}; public Class() { } public IEnumerator GetEnumerator() { return myselfdata.GetEnumerator(); } }
二、利用yield关键字来实现迭代器,还可以实现自命名迭代器。
yield关键字用来向调用方的foreach结构返回指定值,达到yield return返回后会记录下当前位置,下次从当前位置返回,yield break会退出迭代。
class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); // TODO: Implement Functionality Here Class2 classs=new Class2(); //GetEnumerator 默认迭代器 foreach(int item in classs) { Console.WriteLine("默认迭代器GetEnumerator "+item); } //GetMyData 迭代器,自定义迭代器, 这里报错暂时没找到原因 // foreach(int item in classs.GetMyData(true)) // { // Console.WriteLine("自命名迭代器GetMyData "+item); // } //自定义命令迭代器也可直接用接口来实现 IEnumerator mydata= classs.GetMyData(false); while(mydata.MoveNext()) { Console.WriteLine("自命名迭代器GetMyData "+mydata.Current); } Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } public class Class2:IEnumerable { int[] myselfdata=new int[]{1,2,3}; public Class2() { } public IEnumerator GetEnumerator() { yield return myselfdata[0]; yield return myselfdata[1]; yield return myselfdata[2]; //或者 // foreach( int item in myselfdata) // { // yield return item; // } } public IEnumerator GetMyData( bool des) { if(des) { yield return myselfdata[0]; yield return myselfdata[1]; yield return myselfdata[2]; } else { yield return myselfdata[2]; yield return myselfdata[1]; yield return myselfdata[0]; } } }