C#中,什么时候用yield return
yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历。
有这样的一个int类型的集合:
static List<int> GetInitialData(){return new List<int>(){1,2,3,4};}
需要打印出所有值大于2的元素。
不使用yield return的实现
static IEnumerable<int> FilterWithoutYield(){List<int> result = new List<int>();foreach (int i in GetInitialData()){if (i > 2){result.Add(i);} }return result;}
客户端调用:
static void Main(string[] args){foreach (var item in FilterWithoutYield()){Console.WriteLine(item);}Console.ReadKey(); }
输出结果:3,4
使用yeild return实现
static IEnumerable<int> FilterWithYield(){foreach (int i in GetInitialData()){if (i > 2){yield return i;}}yield break;Console.WriteLine("这里的代码不执行");}
客户端调用:
static void Main(string[] args){foreach (var item in FilterWithYield()){Console.WriteLine(item);}Console.ReadKey(); }
输出结果:3,4
总结
通过单步调试发现:
虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。
第一种方法,客户端调用过程大致为:
使用yield return,客户端调用过程大致为:
使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?
--因为,编译器会生成一个状态机来维护迭代器的状态。
简单地说,当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。
转载于:https://www.cnblogs.com/darrenji/p/3832857.html
C#中,什么时候用yield return相关推荐
- Unity中协程的yield return
记录Unity中对于协程常用的一些操作 不管是对于网络请求或加载资源时以及一些相对来说比较耗费时间的运算时,我们不希望会全部写在Update中来占用大量主线程的资源. 协程 : IEnumerator ...
- yield学习续:yield return迭代块在Unity3D中的应用——协程
必读好文推荐: Unity协程(Coroutine)原理深入剖析 Unity协程(Coroutine)原理深入剖析再续 上面的文章说得太透彻,所以这里就记一下自己的学习笔记了. 首先要说明的是,协程并 ...
- 可惜Java中没有yield return
项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...
- C#.Net工作笔记009---c#中Yield Return语法的作用和好处
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 看到项目里用到了,查了一下,这个的作用是: yield return会对当前执行的 保存,阻塞当前 ...
- C#中yield return用法分析
转载地址:https://www.jb51.net/article/54810.htm 这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield ret ...
- C#中yield return用法
转载:http://www.jb51.net/article/54810.htm http://www.cnblogs.com/HunterWei/archive/2012/06/13/csharpy ...
- Unity中 yield return 1 的误区
曾经一度认为,使用IEnumerator时yield return 1代表的是等一帧,yield return 100是等100帧,网上也有很多这样的帖子,其实发现是不正确的. yield retur ...
- yield return的理解
一直在实际开发中都有用到yield return,但也一直只停留在"用"的层面上,可谓一知半解.今天下班回来自己查证思考了半天,本着自己的原则一切从简提炼了一下几点(正确与否有待进 ...
- yield return关键字怎么使用?
在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一: 复制代码 yield return <expression>;yield break; 备注计算表达式并以枚举数 ...
最新文章
- linux下查看网卡型号
- 实验4 [BX]和loop指令
- 【Win32汇编】五种寻址方式
- QT绘制堆叠水平条形图
- 使用Fiddler为满足某些特定格式的网络请求返回mock响应
- 海报设计素材模板|炫彩创意PSD分层时尚艺术海报 ​​​​
- pytorch 语义分割loss_关于pytorch语义分割二分类问题的两种做法
- HDP Hive StorageHandler 下推优化的坑
- 被称为最好最易理解的MATLAB入门教程
- 2019年10月江苏计算机二级C语言编程题解析
- hp linux还原系统还原,酷越一键备份还原(惠普电脑系统还原)精简美化版...
- 【记录】【0】好的博客,待整理
- Android启动优化--异步优化
- 194.Vue.js智能扫码点餐系统(二十八)【支付宝支付流程、Nodejs支付源码解析、 实现支付功能(支付宝支付)】2019.04.01
- Hitting the database(Chapter 5 of Spring In Action)
- IEEE Access 算法 伪代码排版出错
- 服务器用户名 administrator 修改,windows2003中Administrator用户名与密码修改图解Windows服务器操作系统 -电脑资料...
- 华为mate40pro和华为mate30pro的区别
- 五个无刷马达驱动电路分享!
- 列表ul li前面的点如何更改颜色、形状、大小
热门文章
- 定义数据表之间的关联 (DataSet.Relations.Add)
- Object Pascal 中类型
- 信号的高级特性-核心转储文件
- 使用MFC进行编程,绘制直线椭圆以及样条曲线
- 【CyberSecurityLearning 13】简单抓包及 IP包头分析与 路由原理(一)
- table { border-collapse:collapse; }
- Linux 网络诊断命令
- 一文看懂Python(四)-----os.path模块篇
- LIVE555再学习 -- OpenRTSP 源码分析
- 计算机与外部设备通讯的接口,总线接口与计算机通信(四)USB外部总线(初级认识)...