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);
            }
        }
    }

 

原文地址:https://www.cnblogs.com/janghe/p/7454867.html