zoukankan      html  css  js  c++  java
  • C# 中的迭代器 yield关键字 提高性能和可读性

    展示一个例子

    IList<string> FindBobs(IEnumerable<string> names)
    {
        var bobs = new List<string>();
    
        foreach(var currName in names)
        {
            if(currName == "Bob")
                bobs.Add(currName);
        }
    
        return bobs;
    }

    这里使用IEnumerable<string>作为参数类型并以IList<string>作为返回类型,通常来说,我更倾向于在参数输入的类型方面的范围越宽越好,但在返回类型上面更加严格(译者按:即输入时多用基类或接口,返回时用子类或实现类),对于输入来说,如果你需要用foreach来对其进行循环的话,使用IEnumerable会更有意义。而对于输出(译者按:也就是返回),我使用接口来让实现部分可以改变。在这里我想让调用者省去生成列表的麻烦,所以我选择list作为返回类型.

    而问题在于,我的设计并不具有可链接性,这样的设计需要产生列表作为返回值,实现上,这个列表或许不会很大,但这并不必要

    现在,让我们来看看以“yield”的方式来做这些

    IEnumerable<string> FindBobs(IEnumerable<string> names)
    {
        foreach(var currName in names)
        {
            if(currName == "Bob")
                yield return currName;
        }
    }

    我们将返回类型改为IEnumerable,并且我们使用”yield return”.注意我再也不需要创建一个列表

    当使用”yield return”关键词组时,.net会为你生成一大串管道代码,你可以尽管假装这是个魔法。当开始在被调用的代码中循环时(这里不是list),实现上发生的是这个函数被一遍一遍的调用,但每一次都从上一次执行退出的部分开始继续执行.

     传统的执行方法

    1. 调用函数
    2. 函数执行并返回list
    3. 调用部分使用返回的list

    Yield的执行方法

    1. 调用函数
    2. 调用者请求item
    3. 下一个item返回
    4. 回到步骤2

    转载原地址 http://www.cnblogs.com/CareySon/archive/2009/12/16/1625469.html

  • 相关阅读:
    printf里的=、++
    线程也疯狂-----异步编程
    自己搭建node服务器环境(请求静态资源、get请求、post请求)
    React学习
    2020.10-2021-01总结
    接圈的作用和缺点
    CWnd,HWND; CDC,HDC
    Python通过requests模块处理form-data请求格式
    element-ui resetFields 无效的问题
    用python 将数字每三组分割
  • 原文地址:https://www.cnblogs.com/wphl-27/p/6795523.html
Copyright © 2011-2022 走看看