迭代器的常见运用--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 语句

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

最新文章

  1. Codeforces Round #384 (Div. 2) B. Chloe and the sequence(规律题)
  2. mysql slow query---pt-query-digest----db structure consistency,monitor table records before and after transaction.
  3. 为什么Java中字符串是不可变的
  4. Internship-ZOJ2532(网络流求割边)
  5. Yii 框架生成缩略图
  6. Using UTL_DBWS to Make a Database 11g Callout to a Document Style Web Service
  7. TypeError: Object #&lt;IncomingMessage&gt; has no method &#39;flash&#39;
  8. CSS实现侧边栏固定宽度,内容栏自适应
  9. Tomcat热部署:Maven项目一键部署到Tomcat服务器 - 支持多环境
  10. PHP用户注册邮箱并验证激活帐号
  11. 跟我一起读postgresql源码(六)——Executor(查询执行模块之——查询执行策略)
  12. weblogic的使用
  13. 解决:HTTP 错误 404.0 - Not Found.您要找的资源已被删除、已更名或暂时不可用。(记录帖)
  14. CF914G Sum the Fibonacci FWT、子集卷积
  15. day_11函数的形参与实参
  16. 第一篇----mysql体系
  17. shell基础:预定义变量
  18. java高精度实数和小数
  19. vue之回车触发表单提交
  20. jvm(2)类的初始化(一)

热门文章

  1. Kubernetes 1.13.3 部署 Prometheus+Grafana-7.5.2(最新版本踩坑)
  2. java并发编程基础—生命周期与线程控制
  3. Python+Requests+Re(正则)爬取某糗事百科图片(数据分析一)
  4. sql-5-事务,索引
  5. 微信小程序云开发-数据库-用户更新数据并提交
  6. [考试总结]noip模拟16
  7. string子串匹配(用string自带函数,不涉及char数组转换)
  8. Xmanager7 xshell7 xftp7安装破解教程
  9. jstack 命令使用经验总结
  10. php预定义常量运用