关于迭代器及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( ...
随机推荐
- TCP/UDP简易通信
TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的 ...
- jsScript中的一些操作方法
1.采用dom方式对script标签进行操作 var h = document.getElementsByTagName('HEAD').item(0); var s = document.creat ...
- Loadrunner11.00破解方法
1.下载 从http://www.jb51.net/softs/71240.html上面下载到loadrunner 11.0 2.安装loadrunner 11.0 下载之后,我是直接解压到硬盘,再安 ...
- from声明
在整个应用程序,只有三行声明.这是最短单WIN32应用,但它的功能是非常有限,简单地显示一个消息框,示出来,其他什么事情也没有做.以下就来分析这三行语句了.别小看这三行语句.其实是隐藏着非常多知识点在 ...
- .NET 对象序列化和系列化德
DataSet ds = new DataSet(); //给ds赋值(省略) byte[] b = this.Serialize(ds); DataSet d1 = this.DeSerialize ...
- 从Ubuntu12.04升级到Ubuntu 14.04之后,系统将无法启动
进入Ubuntu启动界面.通常有几个选项,Ubuntu,Ubuntu先进... 输入e键,进入grub的设置界面.将里面的ro改动为rw就可以. 以上能够启动,临时性的设置 可是为了永久保存这个设置, ...
- Swift中文教程(二)--简单值
原文:Swift中文教程(二)--简单值 Swift使用let关键字声明常量,var关键字声明变量.常量无需在编译时指定,但至少要被赋值一次.也就是说,赋值一次多次使用: var myVariable ...
- HTML解析利器-HtmlAgility学习
原文:HTML解析利器-HtmlAgility学习 HtmlAgility是一个开源的Html解析库,据说是C#版的JQuery,功能非常强大. 该篇学习它的解析功能,还可以模拟用户请求,创建html ...
- js前端分页之jQuery
锋利的js前端分页之jQuery 大家在作分页时,多数是在后台返回一个导航条的html字符串,其实在前端用js也很好实现. 调用pager方法,输入参数,会返回一个导航条的html字符串.方法的内部比 ...
- poj 3273 Monthly Expense (二分)
//最大值最小 //天数的a[i]值是固定的 不能改变顺序 # include <algorithm> # include <string.h> # include <s ...