如何在 C# 中使用 yield

yield关键词是在 C# 2.0 中被引入的,我们都知道实现了 IEnumerable 接口的类都可以用于被 foreach 迭代,这是因为 IEnumerable 接口中提供了一个可迭代的 GetEnumerator() 方法,代码定义如下:

public interface IEnumerable{IEnumerator GetEnumerator();}

现在你也可以使用 yield 关键词来指定某些方法也是可以被迭代的,通常 C# 中有两种 yield 的语法格式:yield return <expression>yield break

为什么要使用 yield 关键词

yield关键词可以实现一种 状态迭代 而不需要提前创建好一个临时集合,换句话说,当你在迭代器中使用 yield return 时,在数据返回之前你不需要创建一个临时集合来存储数据,你可以利用 yield return 一次性返回集合中的每项数据,同时你也可以在方法和get访问器中使用带有迭代的 yield return 语句,值得注意的是,当每次执行 yield return 语句后,控制权都会转交给调用者。

说了这么多,如果有点懵的话,我们来看一个例子,下面的代码展示了如何使用 yield 关键词来返回 Fibonacci 数字,这个方法接收一个int类型的参数。

static IEnumerable<int> GenerateFibonacciNumbers(int n){for (int i = 0, j = 0, k = 1; i < n; i++){yield return j;int temp = j + k;j = k;k = temp;}}

上面的代码中 yield return j 在不退出 for 循环的情况下逐个返回斐波那契数,换句话说,这个迭代状态是被保留的,下面的代码展示了如何调用 GenerateFibonacciNumbers()

foreach (int x in GenerateFibonacciNumbers(10)){Console.WriteLine(x);}

下面是仅供参考的完整代码。

class Program{static void Main(string[] args){foreach (int x in GenerateFibonacciNumbers(10)){Console.WriteLine(x);}}static IEnumerable<int> GenerateFibonacciNumbers(int n){for (int i = 0, j = 0, k = 1; i < n; i++){yield return j;int temp = j + k;j = k;k = temp;}}}

也许你注意到了,上面的代码并没有创建一个 list 或者 array 去存放那些输出到控制台的斐波那契额数。

yield 关键词的另一个优点在于可以按需创建和返回你需要的数,下面的代码展示了 Get方法器 中仅返回 1-10 之间的偶数。

public static IEnumerable<int> EvenNumbers{get{for (int i = 1; i <= 10; i++){if ((i % 2) == 0)yield return i;}}}

你也可以使用 yield break 来提前中断一个迭代链,如下代码所示:

public IEnumerable<T> GetData<T>(IEnumerable<T> items){if (null == items)yield break;foreach (T item in items)yield return item;}

几点原则

当你在用 yield 时,请记住如下几点。

  • yield return 不能套在 try-catch 中,否则会报错。

  • yield break 不能放在 finally 中。

  • yield 方法的返回类型只能是 IEnumerable, IEnumerable<T>, IEnumerator,IEnumerator<T>

  • 在 yiled 的方法参数中不能使用 ref,out 标记。

  • 不能将 yield returnyield break 放在匿名方法中。

  • 不能将 yield returnyield break 放在 unsafe 方法中。

译文链接:https://www.infoworld.com/article/3122592/my-two-cents-on-the-yield-keyword-in-c.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过听力写代码?盲人程序员就是这样做的

一Michael Forzano&#xff0c;Amazon2018 年 3 月&#xff0c;Amazon 官网「工作在 Amazon」栏目有一篇文章&#xff0c;介绍了他们的一位盲人程序员 Michael Forzano。&#xff08;视频来自&#xff1a;阑夕&#xff09;Amazon 软件工程师 Michael Forzano 出生就因先天疾病而…

android修改电量颜色,android状态栏电池颜色?

鸿蒙传说/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java在Intent.ACTION_BATTERY_CHANGED broadcast处理中调用fireBatteryLevelChanged()方法fireBatteryLevelChanged中会回掉BatteryStateChangeCallbackframewor…

access 战地1不加入ea_炒牛肉时,想要牛肉嫩滑又不老,只需加入1样东西,很多人都不懂...

炒牛肉时&#xff0c;想要牛肉嫩滑又不老&#xff0c;只需加入1样东西&#xff0c;很多人都不懂冬季滋补怎么能少得了牛肉&#xff0c;牛肉中含有非常丰富的营养成分&#xff0c;其中蛋白质的含量尤为丰富还有大量的氨基酸&#xff0c;能够提高身体的抗病能力&#xff0c;特别适…

张亚勤:PC之外的争夺战

文 / 陈振烨 尽管经常有公司抢走微软的风头&#xff0c;但当今世界&#xff0c;微软仍然是当之无愧的IT霸主。过去几个季度&#xff0c;微软各项核心数据非常给力&#xff0c;2011财年第一季度净利润54亿美元&#xff0c;营收162亿美元&#xff1b;而2010财年187.6亿美元的净利…

优化 ASP.NET Core Docker 镜像的大小

在这容器化的世界里&#xff0c;我们已经很少直接通过文件发布来运行asp.net core程序了。现在大多数情况下&#xff0c;我们都会使用docker来运行程序。在使用docker之前&#xff0c;我们往往需要打包我们的应用程序。asp.net core程序的镜像打包&#xff0c;网上有很多教程&a…

监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法

没人会看的开场白&#xff1a;本来觉得自己从数据建模转人工智能方向应该问题不大&#xff08;自我感觉自己算法学的不错&#xff09;。结果一个K-邻近实现手写数字识别的代码就让我改了三四天。虽然网上这方面的代码是很多&#xff0c;但是我运行了好几个&#xff0c;结果都不…

xp怎样安装android-studio,Xposed 框架的安装

借鉴&#xff1a;安装流程&#xff1a;安装 雷电模拟器3.93下载安装xposed框架。xposed 框架在Dalvik 虚拟机和ART虚拟机上的安装不一样(至于ART虚拟机和Dalvik虚拟机的区别&#xff0c;可以参阅 文章)如果Android 版本不小于 5.0&#xff0c;就是ART版本的虚拟机&#xff0c;需…

在 .NET Core 5 中集成 Create React app

翻译自 Camilo Reyes 2021年2月22日的文章 《Integrate Create React app with .NET Core 5》 [1]本文演示了如何将 Create React app 与 .NET Core 集成&#xff0c;以生成一个移除了几个依赖项的脚手架。Create React app 是社区中创建一个全新 React 项目的首选方式。该工具…

程序员找不到对象是因为还没遇到一个有远见的丈母娘

当别人在放肆秀恩爱的时候&#xff0c;程序员单身狗们在角落里瑟瑟发抖。别人去网站相亲找到对象&#xff0c;程序员去相亲找到BUG。其实&#xff0c;你找不到对象是因为你还没遇到一个有远见的丈母娘。都说程序员很难找到对象&#xff0c;就知道整天对着键盘一直敲敲敲&#x…

WPF 如何将IconFont图标转成Geometry

之前每次使用IconFont图标&#xff0c;都要去下载一个png图片&#xff0c;每次颜色什么的改了&#xff0c;都要重新下载&#xff0c;太苦逼了。现在好了&#xff0c;终于找到如何方便快速地使用IconFont图标了。是应该的演示如何从IconFont网站上找到Geometry先看看效果吧&…

给所有想从事软件研发的年轻工程师的忠告与建议

图片来源&#xff1a;Fargo Season 3一、我为什么写这篇文章&#xff1a;这几天&#xff0c;在某个IT论坛的软件培训与认证栏目中&#xff0c;看到了很多处于迷惑之中的人们&#xff0c;也看到了许多大家普遍感到困惑的问题&#xff0c;写此文章的目的&#xff0c;是想将我这些…

谁今天收到鸿蒙系统推送,鸿蒙系统正式推送,只有部分高端机才能收到

原标题&#xff1a;鸿蒙系统正式推送&#xff0c;只有部分高端机才能收到华为已经对鸿蒙2.0系统开始进行推送更新&#xff0c;从华为推出鸿蒙系统概念已经时隔几年了&#xff0c;如今华为把ppt系统映射进现实是真正为自己正名了&#xff0c;而且据华为陈述鸿蒙2.0已经能达到安卓…

2020邮箱账号密码大全_通知 | 复旦大学2020年春季学期研究生选课FAQ

1选课须知1. 研究生选课系统什么时间开放&#xff1f; 答&#xff1a;2020年春季学期研究生选课系统开放时间为&#xff1a;2020年2月19日(周三)10:00至2020年3月9日(周一)10:00。2020年3月9日(周一)10:00后&#xff0c;研究生可以在选课系统中查询课表、已选课程、学分获得情况…

如何从零开始构建深度学习项目?这里有一份详细的教程

导读&#xff1a;在学习了有关深度学习的理论之后&#xff0c;很多人都会有兴趣尝试构建一个属于自己的项目。本文将会从第一步开始&#xff0c;告诉你如何解决项目开发中会遇到的各类问题。本文由六大部分组成&#xff0c;涵盖深度学习 ( DL ) 项目的整个过程。我们将使用一个…

性能分布式NewLife.XCode对无限数据的支持

上周发布了《改进版CodeTimer及XCode性能测试》&#xff0c;展示了NewLife.XCode在性能上的表现。实际上NewLife.XCode是一个很平凡的ORM&#xff0c;只是在分页和缓存方面多下点功夫&#xff0c;注意每一个细节&#xff0c;才能保证在数据量大、业务繁忙的环境中得以保持良好的…

C#实用小知识:string和判断null

stringstring是常用的类型&#xff0c;它具有不可变性&#xff1a;就是一旦赋值&#xff0c;就不可变&#xff0c;如果再赋值 &#xff0c;就重新开辟内存空间&#xff1b;保留性&#xff1a;如果一个字符串存在&#xff0c;另一个与其相同&#xff0c;他们会指向同一个地址&am…

.net html5页面缓存,详解HTML5中的manifest缓存使用

起源html5之前的网页&#xff0c;都是无连接&#xff0c;必须联网才能访问&#xff0c;这其实也是web的特色&#xff0c;这其实对于PC是时代问题并不大&#xff0c;但到了移动互联网时代&#xff0c;设备终端位置不再固定&#xff0c;依赖无线信号&#xff0c;网络的可靠性变得…

机器学习的最佳学习路线原来只有四步

AI这个词相信大家都非常熟悉&#xff0c;近几年来人工智能圈子格外热闹&#xff0c;光是AlphoGo就让大家对它刮目相看。今天小天就来跟大家唠一唠如何进军人工智能的第一步——机器学习。在机器学习领域&#xff0c;Python已经成为了主流。一方面因为这门语言简单易上手&#x…

ASP.NET Core Filter如何支持依赖注入

概述通过使用 ASP.NET Core 中的筛选器&#xff0c;可在请求处理管道中的特定阶段之前或之后运行代码。内置筛选器处理任务&#xff0c;例如&#xff1a;授权&#xff08;防止用户访问未获授权的资源&#xff09;。响应缓存&#xff08;对请求管道进行短路出路&#xff0c;以便…

做流向图_各类型供热暖系统图大全,一饱眼福!

↑ 点击上方“暖通风向标”关注我们推广.暖通风向标本文来源&#xff1a;制冷网好书推荐做热泵这几本书你不得不看&#xff01;区域供热系统热电联产系统地热水供暖系统即热式生活热水系统即热式特点:可保证用户随时随地均有热水供应&#xff0c;系统紧凑&#xff0c;无需储罐&…