关于迭代器及yield的用法
1、foreach语句
C#编译器会把foreach语句转换为IEnumerable接口的方法和属性。
- foreach (Person p in persons)
- {
- Console.WriteLine(p);
- }
foreach语句会解析为下面的代码段。
- 调用GetEnumerator()方法,获得数组的一个枚举
- 在while循环中,只要MoveNext()返回true,就一直循环下去
- 用Current属性访问数组中的元素
- IEnumerator enumerator = persons. GetEnumerator();
- while (enumerator.MoveNext())
- {
- Person p = (Person) enumerator.Current;
- Console.WriteLine(p);
- }
2. yield语句
- yield语句的两种形式:
- yield return <expression>;
- yield break;
- 使用一个yield return语句返回集合的一个元素
- 包含yield语句的方法或属性是迭代器。迭代器必须满足以下要求
a. 返回类型必须是IEnumerable、IEnumerable<T>、IEnumerator或 IEnumerator<T>。
b. 它不能有任何ref或out参数
- yield return语句不能位于try-catch快。yield return语句可以位于try-finally的try块

- try
- {
- // ERROR: Cannot yield a value in the boday of a try block with a catch clause
- yield return "test";
- }
- catch
- { }
- try
- {
- //
- yield return "test again";
- }
- finally
- { }
- try
- { }
- finally
- {
- // ERROR: Cannot yield in the body of a finally clause
- yield return "";
- }

- yield break语句可以位于try块或catch块,但是不能位于finally块
3、实例
- class Program
- {
- static void Main(string[] args)
- {
- foreach (int i in List.Power(,))
- {
- Console.WriteLine(i);
- }
- }
- }
- public class List
- {
- public static IEnumerable<int> Power(int num, int exponent)
- {
- int counter = ;
- int result = ;
- while (counter++ < exponent)
- {
- result *= num;
- yield return result;
- Thread.Sleep();//效果很有意思
- }
- }
- }
- internal class Program
- {
- static void Main(string[] args)
- {
- A a=new A();
- foreach (string s in a)
- {
- Console.WriteLine(s);
- }
- Console.WriteLine();
- foreach (string s in a.Reverse())
- {
- Console.WriteLine(s);
- }
- Console.WriteLine();
- foreach (string s in a.GetEnumerator(,))
- {
- Console.WriteLine(s);
- }
- Console.ReadKey();
- }
- }
- public class A
- {
- private string[] strs = {"a", "b", "c", "d"};
- public IEnumerator<string> GetEnumerator()
- {
- for (int i = ; i < ; i++)
- {
- yield return strs[i];
- }
- }
- public IEnumerable<string> Reverse()
- {
- for (int i = ; i>=; i--)
- {
- yield return strs[i];
- }
- }
- public IEnumerable<string> GetEnumerator(int index,int length)
- {
- for (int i = index; i < index+length ; i++)
- {
- yield return strs[i];
- }
- }
- }
结果:
aaarticlea/png;base64,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" alt="" />
关于迭代器及yield的用法的更多相关文章
- python 生成器与迭代器(yield 用法)
背景 首先,我不会解释这两个名词,我看过很多遍解释,可还是看不懂,还是直接看使用情景吧. 我们以佩波拉契数列为例,当我们不知道迭代器的情况下,我们写出来的代码可能是这样子的: '''这种方式计算fib ...
- C#中yield return用法分析
这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文 ...
- C# yield return 用法与解析
原文:C# yield return 用法与解析 C# yield return 用法与解析 本文参考自:http://www.jb51.net/article/54810.htm 当初没有认真理解 ...
- C# yield return用法
本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yi ...
- Python入门之迭代器/生成器/yield的表达方式/面向过程编程
本章内容 迭代器 面向过程编程 一.什么是迭代 二.什么是迭代器 三.迭代器演示和举例 四.生成器yield基础 五.生成器yield的表达式形式 六.面向过程编程 ================= ...
- yield关键字用法与解析(C# 参考)
yield 关键字向编译器指示它所在的方法是迭代器块. 编译器生成一个类来实现迭代器块中表示的行为. 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值. 这是一个返 ...
- Python中“*”和“**”的用法 || yield的用法 || ‘$in’和'$nin' || python @property的含义
一.单星号 * 采用 * 可将列表或元祖中的元素直接取出,作为随机数的上下限: import random a = [1,4] print(random.randrange(*a)) 或者for循环输 ...
- C#中的yield return用法演示源码
下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ...
- Python yield的用法
yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法. 只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist( ...
随机推荐
- js之按键总结
js 实现键盘记录 兼容FireFox和IE 2009-01-07 11:43 作者:羽殇仁 转载请注明出处,谢谢. 本篇文章是我的第一百篇blog文章,恭喜一下! 这两天突然想弄弄js的键盘记录,所 ...
- Android发展的一个重要方面Makefile分析
Android发展的一个重要方面Makefile分析 随着移动互联网的发展,移动开发也越来越吃香了.眼下最火的莫过于android.android是什么就不用说了,android自从开源以来,就受到非 ...
- Quartz.Net任务统一调度框架
山寨版Quartz.Net任务统一调度框架 TaskScheduler 在日常工作中,大家都会经常遇到Win服务,在我工作的这些年中一直在使用Quartz.Net这个任务统一调度框架,也非常好用, ...
- Unix命令操作
基本命令 [ man 查看 ]--万能命令 1.ls 列出文件 (-al) 2.cd 转换目录 3.mkdir 建立新目录 4.cp 拷贝文件 (-R) 5.rm 删除文件 (-rf) 6.mv 移动 ...
- struts2基本介绍
前言 文本 Struts2 Apache SoftWare Foundation Tomcat/Struts1/Struts2/Ibaitas/ MVC框架:Struts1/Struts2/JSF/W ...
- Cocos2d-x学习笔记(14)(更新函数scheduleUpdate、进度计时器CCProgressTo、滚动视图CCScrollView)
一.scheduleUpdate 1.scheduleUpdate:此函数是CCNode的函数,每一个CCNode仅仅要调用scheduleUpdate更新函数,那么这个CCNode就会响应当前类的u ...
- UVA 11525 Permutation(树状数组)
题目意思是说 给你一个数k 然后有k个si 问你1--k 的第n个全排列是多少 注意是 1 2 3...k的全排列 不是si的 N= 由观察得知(k-i)!就是k-i个数字的全排列种数 ...
- nexus私服linux搭建问题
一.最近搭建nexus私服,从官网下载下来总是报503服务器无效,很是无奈,最后在网上找到一个可以用的 收藏起来,这里给大家共享一下 下载地址:http://pan.baidu.com/s/1kT3U ...
- selenium之多线程启动grid分布式测试框架封装(二)
五.domain类创建 在domain包中创建类:RemoteLanchInfo.java 用来保存启动信息. package com.lingfeng.domain; public class Re ...
- cocos2d-x-lua基础系列教程三(lua面向对象)
lua 类 Lua 事实上不是面向对象语言 我们能够用table 模拟仿照面向对象编程 lua 中的this 类似的是self table 也具有生命周期 2,使用table 创建类 projed ...