好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#使用yield关键字构建迭代器详解

以前,如果我们希望构建支持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);

      }

    }

  }

参考: C#中可枚举类型详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://HdhCmsTestcnblogs测试数据/janghe/p/7454867.html

dy("nrwz");

查看更多关于C#使用yield关键字构建迭代器详解的详细内容...

  阅读:50次