C#迭代器实现

一、借助已经实现迭代的类来完成对某类的迭代器

一般情况下想通过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];
            }
        }
    }
    

 

posted on 2017-03-03 20:59  木色小罗  阅读(187)  评论(0编辑  收藏  举报

导航

诗与远方