zoukankan      html  css  js  c++  java
  • C#使用yield关键字构建迭代器

    http://www.cnblogs.com/Huaran1chendu/p/4838536.html

    以前,如果我们希望构建支持foreach枚举的自定义集合,只能实现IEnumerable接口(可能还有IEnumerator()),返回值还必须是IEnumerator类型,除此之外还可以通过迭代器来使用构建foreach循环的类型,详细见下链接。

     public class Car
        {
            //内部状态数据
            public int CurentSpeed;
            public int MaxSpeed;
            public string name;
            //汽车能不能用
            private bool carIsdead;
            //类构造函数
            public Car() { }
            public Car(string name, int currentspeed, int maxspeed = 100)
            {
                this.name = name;
                this.CurentSpeed = currentspeed;
                this.MaxSpeed = maxspeed;
            }
            //定义委托类型
            public delegate void CarEngineHandler(string msdForCar);
            //定义每个委托类型的成员变量
            private CarEngineHandler listOfhandlers;
            //向调用者添加注册函数
            public void RegisterWithCarEngine(CarEngineHandler methodTocall)
            {
                if (listOfhandlers == null)
                    listOfhandlers = methodTocall;
                else
                    listOfhandlers += methodTocall;//支持多路广播
            }
            //实现Accelerate()方法
            public void Accelerate(int delta)
            {
                if (carIsdead)
                {
                    if (listOfhandlers != null)
                    {
                        listOfhandlers("sorry,this car is dead");
                    }
                }
                else
                {
                    CurentSpeed += delta;
                    //不能超过最大速度
                    if (5 == (MaxSpeed - CurentSpeed) && listOfhandlers != null)
                    {
                        listOfhandlers("this speed is nearly to the maxspeed");
                    }
                    if (CurentSpeed > MaxSpeed)
                    {
                        carIsdead = true;
                    }
                    else
                        Console.WriteLine("current speed:{0}", CurentSpeed);
                }
            }
        }
        public class Garage : IEnumerable
        {
            private Car[] garage = new Car[3];
            public Garage()
            {
                garage[0] = new Car("a", 10);
                garage[1] = new Car("b", 13);
                garage[2] = new Car("c", 14);
            }
            public Enumerator GetEnumerator()
            {
                //返回数组对象的IEnumerator
                //return garage.GetEnumerator();
                //用yield关键字构建迭代器方法
                foreach (Car c in garage)
                {
                    //当yield return语句执行后,当前位会被
                    //保存下来,下一次执行会从当前位开始
                    yield return c;
                }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Garage g = new Garage();
                foreach (Car c in g)
                {
                    Console.WriteLine("car name:{0}", c.name);
                }
            }
        }

     

  • 相关阅读:
    【转】backtrack5工具之SQLMAP使用笔记(SQL注入用)
    httpd.conf配置详解
    【转】CodeBlocks+wxWidgets安装教程
    Windows下的Photoshop CS6快捷键
    backtrack常用渗透命令
    Codeforces Round #137 (Div. 2)
    Fedora 17 上安装 AMP 服务(Apache MySQL PHP)
    这几天用linux的体验
    EVO 4G 相机 照相 黑屏
    转载:qsort细节用法,double型的排序我竟然一直用错了~~~
  • 原文地址:https://www.cnblogs.com/janghe/p/7454867.html
Copyright © 2011-2022 走看看