迭代器 与 foreach 的区别
迭代器的常见运用--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 的区别的更多相关文章
- IL角度理解for 与foreach的区别——迭代器模式
IL角度理解for 与foreach的区别--迭代器模式 目录 IL角度理解for 与foreach的区别--迭代器模式 1 最常用的设计模式 1.1 背景 1.2 摘要 2 遍历元素 3 删除元素 ...
- for循环与foreach的区别
for循环与foreach的区别 foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后 ...
- every();some();filter();map();forEach()各自区别:
every();some();filter();map();forEach()各自区别: (1)every()方法:(返回值为boolean类型) 对数组每一项都执行测试函数,知道获得对指定的函数返回 ...
- for和foreach的区别
public class Program { public static void Main() { Program program = new Program(); program.For();// ...
- JS中map与forEach的区别
很多同学可能对于map与forEach的区别不是太了解,今天我们介绍一下JS中的map与forEach方法, 我对map的理解是,这个方法对一个数组arr1中的每一个元素进行遍历(传递给一个数组,参数 ...
- Javascript/Jquery 中each() 和forEach()的区别
从名字看上去这两个方法好像有点关系,但在javascript中它们区别还是挺大的. forEach() 用于数组的操作,对数组中的每个元素执行制定的函数(不是数组不能使用forEach()方法). 而 ...
- js keys方法和foreach方法区别
keys和foreach都有遍历对象的功能,但他们可以遍历的对象类型是不一样的,foreach是数组对象的方法,而keys是Object对象的方法.换句话说,foreach只能数组对象使用,而keys ...
- JavaScript中Map和ForEach的区别
译者按: 惯用Haskell的我更爱map. 原文: JavaScript — Map vs. ForEach - What’s the difference between Map and ForE ...
- python中迭代器和生成器的区别
#!/usr/bin/python def power(values): for value in values: print "powing %s" % value yield ...
随机推荐
- 00JAVA语法基础 原码、反码、补码
记得之前学C语言的时候老师课上讲过一些,不过当时觉得考试不考,也就上课听了下,下课也没怎么多做了解.这次,Java课上再次提出来了,自己也超越了些资料,对这三种概念算是有所初步了解. 1.原码 数据储 ...
- 高校表白App-团队冲刺第五天
今天要做什么 封装Adapter制作引导页 今天做了什么 成功封装工具类,为以后的轮播做了铺垫 遇到的问题 在封装时采用数组容器进行操作,只能添加图片作为元素,对于layout不可加入
- Guava Cache使用的三种姿势
姿势一 使用expiredAferWriter 优点 简单 粗暴 缺点 同步阻塞问题:如果多个线程同时请求同一个过期的key,只有一个线程能够获得去加载缓存的锁,但是其他未获取加载缓存锁的线程也会阻塞 ...
- 看懂UML类图笔记
在学习设计模式的时候,经常会遇到UML类图,所以就找了一些资料,做一些笔记. 从一个示例开始 下面这个类图,类之间的关系是我们需要关注的: 车的类图结构为<<abstract>> ...
- 在Vue中echarts可视化组件的使用
echarts组件官网地址:https://echarts.apache.org/examples/zh/index.html 1.找到脚手架项目所在地址,执行cnpm install echarts ...
- java常见的面试题(二)
1.mybatis 中 #{}和 ${}的区别是什么? #{}是预编译处理,${}是字符串替换: Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的 ...
- Git的使用(六)
前言 版本管理工具总结: 开发团队项目,对项目的版本进行管理. 使用过的版本管理工具: TFS.SVN与Git. TFS:管理项目,通过visual Studio管理源码,拉取分支,提交代码等.也可以 ...
- 如何反编译Python写的exe到py
参考链接: https://blog.csdn.net/qq_44198436/article/details/97314626?depth_1-utm_source=distribute.pc_re ...
- redis故障时的一些概念
1.缓存穿透 概念访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉. 解决方案采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤 ...
- JavaScript关于对象的一些小知识
javascript的对象 javascriot(之后用js代替)中基本数据类型之一,是复合类型的数据. 对象在js中应用十分广泛,几乎所有的的事物都是做对象,js的对象拥有自己的属性和方法的数据 在 ...