• 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接口,所以是语法糖。

  • 相关阅读:
    eclipse里面已经提交的svn提交
    session 失效
    svn版本管理
    前端控制台调试经验
    python001环境搭建及入门 http://python.jobbole.com/81332/
    eclipse自己写makefile 建工程
    编码风格
    算法导论第22章22.2广度优先搜索
    vnc相关
    eclipse相关设置
  • 原文地址:https://www.cnblogs.com/adspark/p/11804356.html
Copyright © 2020-2023  润新知