• 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];
                }
            }
        }
        
  • 相关阅读:
    跨域在前端工程化中的实际解决方案。
    细说Vue作用域插槽,匹配应用场景。
    js数据结构之栈和队列的详细实现方法
    js数据结构之hash散列的详细实现方法
    js数据结构之集合的详细实现方法
    js数据结构之二叉树的详细实现方法
    【好记性不如烂笔头】之小程序要点记录
    回想继承、原型与原型链有感
    js数据结构之链表(单链表、双向链表、循环链表)
    js数据结构之列表的详细实现方法
  • 原文地址:https://www.cnblogs.com/musexiaoluo/p/6477098.html
Copyright © 2020-2023  润新知