迭代器的常见运用--Eg:有一组数据 需要对每个符合条件的数据 进行记录

       static void Main()
{
int[] s = new int[] { 1, 2, 8 };
foreach (int term in GetSingleDigitNumbers(s))
{
Console.WriteLine(term);
} Console.ReadKey();
} public static IEnumerable<int> GetSingleDigitNumbers(int[] s)
{
foreach (var item in s)
{
if (item%2==0)
{
yield return item;
}
}
}

结果:

这里看来 好像直接foreach就能实现

起先我并不明白 两者使用起来到底有什么区别 直到我看到以下实例

IEnumerable<int> Fibonacci(int count)
{
int prev = 1;
int curr = 1;
for (int i = 0; i < count; i++)
{
yield return prev; //把程序控制权交回调用者 同时保留方法本地状态,等到调用者拿到返回的值后 该方法继续往后执行
int temp = prev + curr;
prev = curr;
curr = temp;
}
} void Main()
{
foreach (int term in Fibonacci(10))
{
Console.WriteLine(term);
}
}

对应输出结果



可发现调用Fibonacci 每次返回结果后 依旧继续往后执行 直至此次for结束后 继续进行Fibonacci的for循环 直至循环结束 这样就将符合条件的一组值返回给了调用者

而foreach循环 return后 后续是不会执行的 且 foreach依赖于 .NET Core 库中定义的 2 个泛型接口,才能生成循环访问集合所需的代码:IEnumerable 和 IEnumerator

此外iterators是使用时 才真正调用执行的 Eg:

  static void Main()
{
int[] s = new int[] { 1, 2, 8 };
var p = GetSingleDigitNumbers(s);//此时直接返回符合条件的 IEnumerable<int>{2,8};不会真正的执行方法内操作【 Console.WriteLine("The method was called.");】 //如果p不被调用 则永远不会执行GetSingleDigitNumbers方法内额外的操作【 Console.WriteLine("The method was called.");】
foreach (var item in p)//直至调用时才执行 方法内操作【 Console.WriteLine("The method was called.");】
{
Console.WriteLine(item);
} Console.ReadKey();
} public static IEnumerable<int> GetSingleDigitNumbers(int[] s)
{
foreach (var item in s)
{
if (item%2==0)
{
yield return item;
Console.WriteLine("The method was called.");
}
}
}

结果:

总结:

  • foreach:

    * 通过 return 语句立即把程序的控制权交回给调用者,同时也会把方法内的本地资源释放掉

    * 依赖于 .NET Core 库中定义的 2 个泛型接口,才能生成循环访问集合所需的代码:IEnumerable 和 IEnumerator
  • iterator:

    * 使用yeild return 可依次返回多个值给调用者的期间仍保留方法内本地资源,等所有值都返回结束时,再释放掉方法内资源,这些返回的值形成一组序列被调用者使用

    * 同一方法中不能同时使用 return 语句和 yield return 语句

    * 本身仅返回一组有效值 方法内额外操作 仅在结果被调用时执行

迭代器 与 foreach 的区别的更多相关文章

  1. IL角度理解for 与foreach的区别——迭代器模式

    IL角度理解for 与foreach的区别--迭代器模式 目录 IL角度理解for 与foreach的区别--迭代器模式 1 最常用的设计模式 1.1 背景 1.2 摘要 2 遍历元素 3 删除元素 ...

  2. for循环与foreach的区别

    for循环与foreach的区别 foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后 ...

  3. every();some();filter();map();forEach()各自区别:

    every();some();filter();map();forEach()各自区别: (1)every()方法:(返回值为boolean类型) 对数组每一项都执行测试函数,知道获得对指定的函数返回 ...

  4. for和foreach的区别

    public class Program { public static void Main() { Program program = new Program(); program.For();// ...

  5. JS中map与forEach的区别

    很多同学可能对于map与forEach的区别不是太了解,今天我们介绍一下JS中的map与forEach方法, 我对map的理解是,这个方法对一个数组arr1中的每一个元素进行遍历(传递给一个数组,参数 ...

  6. Javascript/Jquery 中each() 和forEach()的区别

    从名字看上去这两个方法好像有点关系,但在javascript中它们区别还是挺大的. forEach() 用于数组的操作,对数组中的每个元素执行制定的函数(不是数组不能使用forEach()方法). 而 ...

  7. js keys方法和foreach方法区别

    keys和foreach都有遍历对象的功能,但他们可以遍历的对象类型是不一样的,foreach是数组对象的方法,而keys是Object对象的方法.换句话说,foreach只能数组对象使用,而keys ...

  8. JavaScript中Map和ForEach的区别

    译者按: 惯用Haskell的我更爱map. 原文: JavaScript — Map vs. ForEach - What’s the difference between Map and ForE ...

  9. python中迭代器和生成器的区别

    #!/usr/bin/python def power(values): for value in values: print "powing %s" % value yield ...

随机推荐

  1. 前端js重组树形结构数据方法封装

    不知道大家平时工作中,有没有遇到这样一种情况:后端接口返回的数据,全都是一维的数组,都是平铺直叙式的数据,业务需求却要你实现树形结构的功能.那么,针对这种情况该怎么办呢?是跟后台好好沟通一下呢,还是沟 ...

  2. spring-3-spring整合mybatis

    版本和依赖 MyBatis-Spring 需要以下版本: maven依赖 <dependency> <groupId>org.mybatis</groupId> & ...

  3. 【保姆级】利用Github搭建自己的个人博客,看完就会

    大家好,我是辰哥~ 作为一名喜欢技术的爱好者,平时喜欢把自己学习技术的心得或者一些踩坑.易错的过程记录下来,首选的是技术平台(博客),今天辰哥来教大家如何利用Github来搭建一个自己的个人博客平台. ...

  4. P6106 [Ynoi2010] Self Adjusting Top Tree

    P6106 [Ynoi2010] Self Adjusting Top Tree 题意 给出平面直角坐标系上若干不与坐标轴平行的处于第一象限的互不相交的线段,多次询问平面中一个第一象限的矩形与这些线段 ...

  5. KMP子串匹配(只能匹配出唯一子串)

    using namespace std; #include <iostream> #include<string> //自定义字符串存储结构String(包括char数组.le ...

  6. python中的常用内建属性与内建函数

    常用专有属性常用专有属性 说明 触发方式 __init__ 构造初始化函数 创建实例后,赋值时使用,在__new__后 __new__ 生成实例所需属性 创建实例时 __class__ 实例所在的类 ...

  7. 构建后端第2篇之---springb @ComponentScan注解使用

    张艳涛写于2021-2-8日 构建后端项目的时候遇到一个问题,在zyt-auth项目的依赖定义了@Component类,这个类在项目启动的时候提示没有找到bean Field tokenService ...

  8. vue+element实现分页--之--前端分页

    效果图: 访问的数据量小,一次返回所有数据,再次利用elementUI-Table 和el-pagination组件进行展示,关键点事数据的筛选 官网的完整案例 <div class=" ...

  9. 论文笔记:(ICML2020)On Learning Sets of Symmetric Elements

    目录 摘要 一.引言 二.先前的工作 三.基础 3.1 符号和基本定义 3.2 G-不变网络 3.3 描述等变层 3.4 Deep sets 四.DSS层 4.1 对称元素集合 4.2 等变层的表征 ...

  10. "virtualbox for mac安装器遇到了一个错误, 导致安装失败. 请联系软件制造商以获得帮助"的解决办法

    virtualbox下载地址: https://www.virtualbox.org/wiki/Downloads 原因:"Mac OS 10.13.4 会阻止外部内核扩展的安装" ...