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 ...
随机推荐
- visio移动形状 上下左右键 移动滚动条
今天在用visio写作业,想微移visio的形状,于是按上下左右方向键,结果移动的是滚动条. 那么如何让visio按上下左右移动的是形状,其实按Scroll键就好了.
- openwrt下 samba设置
1. 增加用户: 可以手工直接修改 /etc/passwd, 增加一行: samba:x:102:100::/home/samba:#也可命令如下opkg updateopkg install sha ...
- Struts2 06--系统拦截器防止数据重复提交
一.拦截器简要概述 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 在W ...
- UVa 10954,Add All
Huffman编码简化版,优先队列搞定. 1A 调试的时候发现一个问题..木有想明白...问题代码里给出,哪位大神给解释下. #include <iostream> #include &l ...
- 文本处理工具(grep)
文本处理工具: Linux上文本处理三剑客: 文本过滤工具(模式:pattern)工具: 1.grep:支持基本正则表达式; 2.egrep: ...
- C#导出.csv格式的excel表
.cs文件直接贴代码: using System; using System.Collections.Generic; using System.Data; using System.IO; usin ...
- Nginx-OpenResty安装配置
上两篇中介绍了: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 Ngnix技术研究系列2-基于Redis实现动态路由 发现,应该加一篇OpenResty的安装部署说明,方便大家按图索骥 ...
- Java多线程编程核心技术
Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...
- 有序线性表(存储结构数组)--Java实现
/*有序数组:主要是为了提高查找的效率 *查找:无序数组--顺序查找,有序数组--折半查找 *其中插入比无序数组慢 * */ public class MyOrderedArray { private ...
- centos7 最小安装无ifconfig
可能不会有人看到这篇文章,加入有幸被看到,建议读者从后往前看!最小化安装问题:1 没有ifconfig 命令,解决:yum install net-tools2 使用yum install n ...