LINQ学习系列-----2.2 迭代器
在学习本篇迭代器之前,强烈建议可以先学习一位具有工匠精神博主的文章,链接如下:
农码一生---先说IEnumerable,我们每天用的foreach你真的懂它吗?
本篇文章,是在该博主博文的基础上再次深入的研习。
建议:在学习迭代器之前,必须先学习IEnumerable、IEnumerator接口(可点击上链接,学习此接口)
一.什么是迭代器
教科书说法:
说法一:迭代器不会一次性的返回整个集合中的所有值,而是每次只返回一个。
说法二:一个返回值是集合类型的方法,并用yield return 语句来返回集合中的每一项。
个人理解:
如果掌握SQL的游标知识的同学就可以这样理解,迭代器==游标 Cursor
下为一段SQL游标代码:

上图就是一段SQL游标的脚本,迭代器可理解为游标。每次调用fetch next from 移动到下一个项(好比IEnumerator接口中的MoveNext())。while循环正是在外部的循环,循环读取每一项。
二.链接博客的认知

上图中下红框处也可以不用循环,可见下处代码。
上图我们学习到几点:1.yield return 被包含的方法的返回值类型必须是 继承IEnumerator接口的 类型。
2. 由于迭代器是一个一个项输出,所有在得到本项后,外部加循环(此循环包含MoveNext()方法,类似游标的fetch next from)来输出每一项,并移动至迭代器的下一项。
三.迭代器的再次认识
废话不多说,上代码

运行结果如下图:

从结果可以看出,GetArray()方法调用时,结果显示没有显示输出。直到调用遍历来调用迭代器来输出每一项内容,然后将每一项内容输出。
每次遇到 yield return 语句时,该方法都将向调用者返回一个值,foreach循环收到该值之后进行了相应的处理,随后将控制权交回给迭代器方法,再由迭代器方法给出下一个元素。
上图代码中GetArray()返回类型是IEnumerable,不过看上去返回值并不是IEnumerable,原因在于编译器悄悄完成了所需要的工作---为我们自动生成了一个IEnumerable接口的类型,yield return语句让编译器在IL中创建了一个状态系统,这样我们在代码中无需关心其中某一个时刻状态的维护。
状态系统可参考链接博客,下图:


感谢农码一生的精神。
LINQ学习系列-----2.2 迭代器的更多相关文章
- LINQ学习系列-----2.3 迭代器带来的延迟查询
此篇博文承接上一篇博文: LINQ学习系列-----2.2 迭代器 一.第一次执行 废话不多说,上源码: 执行结果下图: 为什么会这样?其实原因很简单 fro ...
- LINQ学习系列-----1.3 扩展方法
这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性. 一.扩展方法介绍 废话不多说,先上源码截图: 上图中Ge ...
- Linq学习系列
LINQ之路系列博客导航 http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html LINQ体验系列文章导航 http://www ...
- LINQ学习系列-----3.1 查询非泛型集合
一.问题起源 LINQ to object在设计时,是配合IEnumerable<T>接口的泛型集合类型使用的,例如字典.数组.List<T>等,但是对于继承了IEnumera ...
- LINQ学习系列-----3.1 查询非泛型集合和多个分组
一.查询非泛型集合 1.问题起源 LINQ to object在设计时,是配合IEnumerable<T>接口的泛型集合类型使用的,例如字典.数组.List<T>等,但是对于继 ...
- LINQ学习系列-----2.1 一个Linq语句
Linq语句介绍 先上源码: 上述代码涵盖了Linq新特性: 代码解析: 针对本文中的几点特性,前面有文章进行阐述.
- Linq学习系列-----1.1 Lambda表达式介绍
1.1 Lambda表达式介绍 下图就是一个典型的Lambda表达式. instance:输入参数 =>:Lambda操作符 instance.MemoryCount>=20*1024 ...
- LINQ学习系列-----1.4 匿名对象
本篇内容接着上一篇继续讲述,本篇简单讲解匿名对象 一.匿名对象介绍 上代码: var result=new { ID=, Name="张三", Age= ...
- Linq学习系列-----1.2 一个简单方法的改进思考及不同的执行形式
一.普通模式: #region 模式1 public Form1() { InitializeComponent(); GetProcessByJudge(); } public bool Memor ...
随机推荐
- LVS+Keepalived高可用负载均衡集群架构实验-01
一.为什么要使用负载均衡技术? 1.系统高可用性 2. 系统可扩展性 3. 负载均衡能力 LVS+keepalived能很好的实现以上的要求,LVS提供负载均衡,keepalived提供健康检查, ...
- shell编程/字库裁剪(2)——编程过程
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7704085.html 作者:窗户 Q ...
- Oracle学习笔记之存储过程
...
- Lustre文件系统测试——obdfilter-survey测试
Lustre文件系统测试--obdfilter-survey测试 介绍 该测试主要是在lustre文件系统工作环境下进行,将直接在ost上生成工作负载模拟并行文件访问,可准确检测盘阵在lustre文件 ...
- MySQL锁类型以及子查询锁表问题、解锁
MySQL中select * for update锁表的范围 MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主 ...
- fio2.1.10--HOWTO
1.0 Overview and history ------------------------ fio was originally written to save me the hassl ...
- LeetCode 75. Sort Colors(排序颜色)
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- R语言进行机器学习方法及实例(一)
版权声明:本文为博主原创文章,转载请注明出处 机器学习的研究领域是发明计算机算法,把数据转变为智能行为.机器学习和数据挖掘的区别可能是机器学习侧重于执行一个已知的任务,而数据发掘是在大数据中寻找有 ...
- 【Win 10 应用开发】UI Composition 札记(一):视图框架的实现
在开始今天的内容之前,老周先说一个问题,这个问题记得以前有人提过的. 设置 Windows.ApplicationModel.Core.CoreApplicationView.TitleBar.Ext ...
- 版本控制之二:SVN的初步使用(转)
转自http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html 上一篇介绍了VisualSVN Server和Tortoise ...