1、foreach语句

C#编译器会把foreach语句转换为IEnumerable接口的方法和属性。

  1. foreach (Person p in persons)
  2. {
  3. Console.WriteLine(p);
  4. }

foreach语句会解析为下面的代码段。

  • 调用GetEnumerator()方法,获得数组的一个枚举
  • 在while循环中,只要MoveNext()返回true,就一直循环下去
  • 用Current属性访问数组中的元素
  1. IEnumerator enumerator = persons. GetEnumerator();
  2. while (enumerator.MoveNext())
  3. {
  4. Person p = (Person) enumerator.Current;
  5. Console.WriteLine(p);
  6. }

2. yield语句

  • yield语句的两种形式:
  1. yield return <expression>;
  2. yield break;
  • 使用一个yield return语句返回集合的一个元素
  • 包含yield语句的方法或属性是迭代器。迭代器必须满足以下要求

a. 返回类型必须是IEnumerable、IEnumerable<T>、IEnumerator或 IEnumerator<T>。

b. 它不能有任何ref或out参数

  • yield return语句不能位于try-catch快。yield return语句可以位于try-finally的try块
  1. try
  2. {
  3. // ERROR: Cannot yield a value in the boday of a try block with a catch clause
  4. yield return "test";
  5. }
  6. catch
  7. { }
  8.  
  9. try
  10. {
  11. //
  12. yield return "test again";
  13. }
  14. finally
  15. { }
  16.  
  17. try
  18. { }
  19. finally
  20. {
  21. // ERROR: Cannot yield in the body of a finally clause
  22. yield return "";
  23. }
  • yield break语句可以位于try块或catch块,但是不能位于finally块

3、实例

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. foreach (int i in List.Power(,))
  6. {
  7. Console.WriteLine(i);
  8. }
  9. }
  10. }
  11.  
  12. public class List
  13. {
  14. public static IEnumerable<int> Power(int num, int exponent)
  15. {
  16. int counter = ;
  17. int result = ;
  18. while (counter++ < exponent)
  19. {
  20. result *= num;
  21. yield return result;
  22. Thread.Sleep();//效果很有意思
  23. }
  24. }
  25. }
  1. internal class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. A a=new A();
  6. foreach (string s in a)
  7. {
  8. Console.WriteLine(s);
  9. }
  10. Console.WriteLine();
  11.  
  12. foreach (string s in a.Reverse())
  13. {
  14. Console.WriteLine(s);
  15. }
  16. Console.WriteLine();
  17.  
  18. foreach (string s in a.GetEnumerator(,))
  19. {
  20. Console.WriteLine(s);
  21. }
  22. Console.ReadKey();
  23. }
  24. }
  25.  
  26. public class A
  27. {
  28. private string[] strs = {"a", "b", "c", "d"};
  29.  
  30. public IEnumerator<string> GetEnumerator()
  31. {
  32. for (int i = ; i < ; i++)
  33. {
  34. yield return strs[i];
  35. }
  36. }
  37.  
  38. public IEnumerable<string> Reverse()
  39. {
  40. for (int i = ; i>=; i--)
  41. {
  42. yield return strs[i];
  43. }
  44. }
  45.  
  46. public IEnumerable<string> GetEnumerator(int index,int length)
  47. {
  48. for (int i = index; i < index+length ; i++)
  49. {
  50. yield return strs[i];
  51. }
  52. }
  53. }

结果:

aaarticlea/png;base64,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" alt="" />

关于迭代器及yield的用法的更多相关文章

  1. python 生成器与迭代器(yield 用法)

    背景 首先,我不会解释这两个名词,我看过很多遍解释,可还是看不懂,还是直接看使用情景吧. 我们以佩波拉契数列为例,当我们不知道迭代器的情况下,我们写出来的代码可能是这样子的: '''这种方式计算fib ...

  2. C#中yield return用法分析

    这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文 ...

  3. C# yield return 用法与解析

    原文:C# yield return 用法与解析 C# yield return 用法与解析 本文参考自:http://www.jb51.net/article/54810.htm 当初没有认真理解 ...

  4. C# yield return用法

    本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yi ...

  5. Python入门之迭代器/生成器/yield的表达方式/面向过程编程

    本章内容 迭代器 面向过程编程 一.什么是迭代 二.什么是迭代器 三.迭代器演示和举例 四.生成器yield基础 五.生成器yield的表达式形式 六.面向过程编程 ================= ...

  6. yield关键字用法与解析(C# 参考)

    yield 关键字向编译器指示它所在的方法是迭代器块. 编译器生成一个类来实现迭代器块中表示的行为. 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值. 这是一个返 ...

  7. Python中“*”和“**”的用法 || yield的用法 || ‘$in’和'$nin' || python @property的含义

    一.单星号 * 采用 * 可将列表或元祖中的元素直接取出,作为随机数的上下限: import random a = [1,4] print(random.randrange(*a)) 或者for循环输 ...

  8. C#中的yield return用法演示源码

    下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ...

  9. Python yield的用法

    yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法. 只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist( ...

随机推荐

  1. js之按键总结

    js 实现键盘记录 兼容FireFox和IE 2009-01-07 11:43 作者:羽殇仁 转载请注明出处,谢谢. 本篇文章是我的第一百篇blog文章,恭喜一下! 这两天突然想弄弄js的键盘记录,所 ...

  2. Android发展的一个重要方面Makefile分析

    Android发展的一个重要方面Makefile分析 随着移动互联网的发展,移动开发也越来越吃香了.眼下最火的莫过于android.android是什么就不用说了,android自从开源以来,就受到非 ...

  3. Quartz.Net任务统一调度框架

    山寨版Quartz.Net任务统一调度框架   TaskScheduler 在日常工作中,大家都会经常遇到Win服务,在我工作的这些年中一直在使用Quartz.Net这个任务统一调度框架,也非常好用, ...

  4. Unix命令操作

    基本命令 [ man 查看 ]--万能命令 1.ls 列出文件 (-al) 2.cd 转换目录 3.mkdir 建立新目录 4.cp 拷贝文件 (-R) 5.rm 删除文件 (-rf) 6.mv 移动 ...

  5. struts2基本介绍

    前言 文本 Struts2 Apache SoftWare Foundation Tomcat/Struts1/Struts2/Ibaitas/ MVC框架:Struts1/Struts2/JSF/W ...

  6. Cocos2d-x学习笔记(14)(更新函数scheduleUpdate、进度计时器CCProgressTo、滚动视图CCScrollView)

    一.scheduleUpdate 1.scheduleUpdate:此函数是CCNode的函数,每一个CCNode仅仅要调用scheduleUpdate更新函数,那么这个CCNode就会响应当前类的u ...

  7. UVA 11525 Permutation(树状数组)

    题目意思是说  给你一个数k  然后有k个si   问你1--k 的第n个全排列是多少   注意是 1 2 3...k的全排列 不是si的 N=   由观察得知(k-i)!就是k-i个数字的全排列种数 ...

  8. nexus私服linux搭建问题

    一.最近搭建nexus私服,从官网下载下来总是报503服务器无效,很是无奈,最后在网上找到一个可以用的 收藏起来,这里给大家共享一下 下载地址:http://pan.baidu.com/s/1kT3U ...

  9. selenium之多线程启动grid分布式测试框架封装(二)

    五.domain类创建 在domain包中创建类:RemoteLanchInfo.java 用来保存启动信息. package com.lingfeng.domain; public class Re ...

  10. cocos2d-x-lua基础系列教程三(lua面向对象)

    lua 类 Lua 事实上不是面向对象语言 我们能够用table 模拟仿照面向对象编程 lua 中的this 类似的是self  table 也具有生命周期 2,使用table  创建类 projed ...