迭代器的常见运用--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. C语言:转义字符 ++a例子

    #include <stdio.h> int main() { printf("a\bwhat\'s\tyour\tname\n"); int k; printf(&q ...

  2. .h .cpp区别

    首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成, 也可以有多个编译单元组成. 如果你 ...

  3. 学习 CLR 源码:连续内存块数据操作的性能优化

    目录 C# 原语类型 1,利用 Buffer 优化数组性能 2,BinaryPrimitives 细粒度操作字节数组 提高代码安全性 3,BitConverter.MemoryMarshal 4,Ma ...

  4. 实验4 RDD编程初级实践

    1.spark-shell交互式编程 (1) 该系总共有多少学生 scala> val lines = sc.textFile("file:///usr/local/spark/spa ...

  5. 【学习笔记】pytorch中squeeze()和unsqueeze()函数介绍

    squeeze用来减少维度, unsqueeze用来增加维度 具体可见下方博客. pytorch中squeeze和unsqueeze

  6. VSCode 使用

    运行时,如何弹出cmd命令窗口:将launch.json文件中的 externalConsole设置为true,并按F5运行(不要按右上角的运行按钮) 如何cin:先再命令窗口通过g++ *.cpp生 ...

  7. python 接口测试之 图片识别

    4.1 pytesser安装 2.安装pytesser,下载地址:http://code.google.com/p/pytesser/ ,下载后直接将其解压到项目代码下,或者解压到python安装目录 ...

  8. 用Python预测双色球福利彩票中奖号码(请不要当真)

    前言 双色球是中国福利彩票的一种玩法. 红球一共6组,每组从1-33中抽取一个,六个互相不重复.然后蓝球是从1-16中抽取一个数字,这整个组成的双色球 python从零基础入门到实战 今天,我们就用P ...

  9. 网络安全日记 ① IIS 之web服务器搭建以及dns转发配置

    IIS(internet info server)服务器的搭建 创建iis服务 打开光驱 选择网络应用服务 安装iis和ftp(后面有讲) 配置服务 通过管理工具打开iis 2. 此时80端口就已经开 ...

  10. 题解CF757B

    题目 题意:在 \(s\) 数组中找出尽可能多的数使得他们的最大公约数 \(>1\) 既然最大公约数 \(>1\),\(s\) 数组的值域是 \(1 \le s_i \le 10^5\), ...