迭代器

迭代器模式是和为模式的一种范例,我们访问数据序列中所有的元素,不用关心序列是什么类型。从数据管道中数据经过一系列不同的转换或过滤后从管道的另一端出来。

像数组、集合等已经内置了迭代器,我们可以直接进行foreach,而我们自定义的类型,自然是无法进行这个操作的,对于自定义的类型实现迭代器模式通过IEnumerable和IEnumerator接口(或泛型接口)进行实现。在C#1.0中我们自定义类型实现迭代器是非常繁琐的

自定义迭代器

想要对IterationSample进行foreach,首先继承IEnumerable接口,会有一个GetEnumerator的方法需要去实现,这时创建另一个类实现IEnumerator接口,实现MoveNext方法与Current属性,我们需要进行位置的处理

这时就可以使用foreach这个"语法糖"进行遍历了,为什么说是语法糖呢, 因为这只是微软进行的一个封装处理,编译成IL过后还是会看到调用了GetEnumerator、MoveNext以及Current

这里在C#2.0中变的简单了,这时使用yield return就可以代替整个IterationSampleIterator这个类。

Yield return会告訴编译器这不是一个普通方法,而是实现迭代器块的方法。

这时可能会有疑問,都yield return了是不是代表方法结束了,并不是这样的,yield return 不代表方法執行结束 ,而是会在这里暫时退出。Yield return内部会为我们生成一个状态机,去维护MoveNext方法与Current属性

这时也许想要看看IL会生成什么样的代码呢,

可以看到有state(状态)current(当前属性)index(索引),用来记录块中位置以及局部变量的值 ,其实看起来和IterationSampleIterator类似,只不过帮我们去做了这个事

可能会对暂时退出产生疑问

下面写一个这样的例子帮助理解,在yield return前与后都有相应的输入,for循环三次,在方法最后打印方法结束

下面进行调用

可以看到以下输入,可以看到第一次执行MoveNext方法才会运行CreateEnumerable方法,也就是foreach是懶惰的,可以看到yield return方法就暂时退出了,只输出了yield return 前,下一次movenext会从上次的位置继续执行输出yield return后,循环结束后才会输出方法结束

除了yield return,还有yield break,这才是真正的直接退出相当与普通方法的return

使用自定义迭代器,可以简化对类型的遍历,有时我们需要读取文件中的第每一行,这样的代码经常会用到 。实现迭代器模型可以更加简化代码。

C#2.0 迭代器的更多相关文章

  1. Python学习笔记:06魔法方法和迭代器

    魔法方法,属性和迭代器 新式类 通过赋值语句__metaclass=true或者class NewStyle(object)继承内建类object,可以表明是新式类. 构造方法 对象被创建后,会立即调 ...

  2. c# 迭代器 与 集合 IEnumerable.GetEnumerator 方法

    示例来源 :msdn 参考:https://msdn.microsoft.com/zh-cn/library/dscyy5s0(v=vs.110).aspx 使用匿名方法.迭代器和部分选件类创建简洁的 ...

  3. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 带你深入理解STL之迭代器和Traits技法

    在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...

  5. 迭代器和增强型for循环

    ★迭代器: Java集合框架的集合类,我们有时候称之为容器.容器的种类有很多种,比如ArrayList.LinkedList.HashSet...,每种容器都有自己的特点,ArrayList底层维护的 ...

  6. 类中的迭代器__iter__

    什么是迭代器 有iter()函数返回,可以通过next(it)函数取值的对象就是迭代器 迭代器协议 迭代器协议是指对象能够使用next函数获取下一项数据,在没有下一项数据时触发一个StopIterat ...

  7. day18_文件处理_迭代器_生成器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ********************day18_文件处理_迭代器_生成器 ************** ...

  8. Python里的迭代器

    迭代器(iterator)协议 · 在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法. 1.__iter__()方法:返回迭代器对象本身: 2.__next ...

  9. Collection迭代器Iterator的使用

    package com.cx.Collecion; import java.util.ArrayList; import java.util.Collection; import java.util. ...

随机推荐

  1. Y1O001波分复用器

    # 波分复用器## 光分波器### 波分合波器种类* 耦合型 * 光纤熔融拉锥 * 熔融拉锥法是指将两根(或两根以上)除去涂覆层的光纤以一定的方法靠拢,在高温加热下熔融,同时向两侧拉伸,最终在加热区形 ...

  2. Exp1 PC平台逆向破解 20164302 王一帆

    1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程 ...

  3. MyBatis3系列__05查询补充&resultMap与resultType区别

    1.查询补充 当你查询一条记录并且是简单查询时,情况相对简单,可以参考以下的例子: public Employee getEmpById(Integer id); 对应的xml文件中: <sel ...

  4. wordcount源代码详解

    package wordcount; import java.io.IOException; import java.util.StringTokenizer; import org.apache.h ...

  5. npm install命令详解

    -S,–save 安装包信息将加到dependencies(生产阶段的依赖) npm install --save 或 npm install -S -D, –save-dev 安装包信息将加到dev ...

  6. 2019中山大学程序设计竞赛-Monitor

    题目地址 题目大意:给你一个n*m的矩形,在这个矩形内告诉你p个矩形(左下角和右上角坐标),问你q个问题,每次也是给你一个矩形(左下角和右上角坐标),问你每个矩形是否可以被开始给的p个矩形完全覆盖. ...

  7. 你不知道的JS之作用域和闭包(一)什么是作用域?

    原文:你不知道的js系列 什么是作用域(Scope)? 作用域 是这样一组规则——它定义了如何存放变量,以及程序如何找到之前定义的变量. 编译器原理 JavaScript 通常被归类为动态语言或者解释 ...

  8. scala Actor Akka

    推荐博客:过往记忆 https://www.iteblog.com/archives/1154.html akka.io

  9. live555工程建立与调试

    Live555是一款开源的RTSP服务器,下载地址http://www.live555.com/liveMedia/public/ 下载下来的代码只有源文件,没有工程文件.那么如何使用VS 调试liv ...

  10. 【RL-TCPnet网络教程】第23章 RL-TCPnet之地址解析协议ARP

    第23章      RL-TCPnet之地址解析协议ARP 本章节为大家讲解ARP(Address Resolution Protocol,地址解析协议),通过前面章节对TCP和UDP的学习,需要大家 ...