zoukankan      html  css  js  c++  java
  • IEnumable和yield

    yield是C#为了简化遍历操作实现的语法糖,我们知道如果要要某个类型支持遍历就必须要实现系统接口IEnumerable,还需要实现IEnumerator,

    static void Main(string[] args)
    {
    foreach (var item in new Program().SayHappyNewYear())
    {
    Console.WriteLine(item);
    }
    MyList2 myList2 = new MyList2();
    foreach (var item in myList2)
    {
    Console.WriteLine(item);
    }
    
    }

    使用yield的写法

    public IEnumerable<String> SayHappyNewYear()
    {
    yield return ""; // yield在这里充当隐式的IEnumerator接口
    yield return "";
    yield return "";
    yield return "";
    yield break; // 向迭代器发出结束迭代的信号
    }

    不使用yield,实现IEnumerable和IEnumerator的写法

    class MyList2 : IEnumerable
    {
    public IEnumerator GetEnumerator()
    {
    IEnumerator tor = new MyEnumerator(0);
    return tor;
    }
    
    public class MyEnumerator : IEnumerator
    {
    private int state;
    private object current;
    public MyEnumerator(int state)
    {
    this.state = state;
    }
    
    public object Current
    {
    get { return current; }
    }
    
    public bool MoveNext()
    {
    switch (state)
    {
    case 0:
    current = "";
    state = 1;
    return true;
    case 1:
    current = "";
    state = 2;
    return true;
    case 2:
    current = "";
    state = 3;
    return true;
    case 3:
    current = "";
    state = 4;
    return true;
    case 4:
    return false;
    default:
    break;
    }
    return false;
    }
    
    public void Reset()
    {
    throw new NotImplementedException();
    }
    }
    }

    使用yield关键字后return 指定的对象后,当前位置会进行保存下来,下次调用的时候会从这个位置开始执行。 
    说白了,C#编译器会在编译后生成一个密封的类,该类实现了IEnumerator接口,所以是语法糖。

  • 相关阅读:
    git更新或者还原本地代码
    log4net配置文件
    用ASP.NET MVC仿站糗事百科
    为表创建索引
    VisualStudio2008+水晶报表的使用
    C#中的位的或运算的理解
    char.IsLetter的使用
    C# 邮箱的使用
    NPOI DataTable导出excel
    NPOI DataSet导出excel
  • 原文地址:https://www.cnblogs.com/adspark/p/11804356.html
Copyright © 2011-2022 走看看