关于迭代器及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( ...
随机推荐
- Mencached使用
Mencached使用小记 该文章简单记录一下在Windows平台下安装与配置Memcached的方法,Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. ...
- JMS样本
1.JMS它是一个制作AS提供Message服务.它接受由生成的消息(Message Provider)消息发出,并转发消息到消息消费者(Message Consumer).2.JMS提供2的消息服 ...
- 十天学Linux内核之第五天---有关Linux文件系统实现的问题
原文:十天学Linux内核之第五天---有关Linux文件系统实现的问题 有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问 ...
- cocos2d-x 3.1.1 学习笔记[4]GridActions 网格动画
文章写的 http://blog.csdn.net/zhouyunxuan 老样子.见代码. //GridActions can only used on NodeGrid auto nodeGri ...
- oracle_powerdesinger逆向工程 , PDM 文件 注释到name的完美解决方案 comment2name
1. 从oracle 到 PDM文件 逆向工程中 ,需要注意 去掉“” ,这个百度下很多帖子,用于去掉引号 2. 从注释copy到name运行脚本会有个问题就是 ,有些注释太长,不美观 解决方案, ...
- oracle_自动备份用户数据,删除N天前的旧数据(非rman,bat+vbs)
有时数据没有实时备份恢复那么高的安全性需求,但每天 ,或者定期备份表结构 和数据依旧是很有必要的,介绍一种方法 在归档和非归档模式均可使用的自动备份方法. 预期效果是备份用户下的数据含表结构,备份文件 ...
- 只有有lua编译能力不足200K代码吧?NO! Python 有可能。
如今Python给人的感觉是大,东西多,在Windows上安装后竟然要占100多兆的空间. lua给人的感觉是非常小,非常轻便.Python 2.7在linux下编译出来的代码在strip之后也有3M ...
- CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)
迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor). 模式角色与结构: 实现代码: using System; us ...
- [ Alcatraz ]管理Xcode插件
[ Alcatraz 配置 ] 1.包管理器在线安装 Terminal终端 $ curl -fsSL https://raw.githubusercontent.com/supermarin/Alca ...
- Socket 由浅入深系列--------- 简单实现编程(三)
socket 由浅入深 原理(一)介绍了一些,以下也就是简单实现,并未考虑其它性能化! 使用TCP的server客户机举例 server 设置一个简单的TCPserver涉及下列步骤: 调用 sock ...