C#关键字:yield

yield是C#为了简化遍历操作实现的语法糖。在语句中使用 yield 关键字,表示在该关键字所在的方法、运算符或 get 访问器是迭代器。有两种形式:

yield return <expression>;
yield break;

这个还是看个实例更清楚:

static void Main(string[] args)
{
    foreach (int i in Power(2, 8))
    {
        Console.Write("{0} ", i);
    }
    // Output: 2 4 8 16 32 64 128 256

    Console.ReadKey();
}

public static System.Collections.IEnumerable Power(int number, int exponent)
{
    int result = 1;
    for (int i = 0; i < exponent; i++)
    {
        result = result * number;
        yield return result;
    }
}

此处,使用了 yield return 返回每一个元素节点。使用  foreach  语句或 LINQ 查询,则使用迭代器方法。 foreach 循环的每次迭代调用迭代器方法。 当 yield return 语句在迭代器方法时为止,expression 返回,并且,代码的当前位置保留。 当下次调用迭代器函数时执行从该位置重新启动。通过调试,我们可以看到代码的执行顺序大致如下:

这个图中标记的顺序可能有点抽象,不知道大家能不能理解?~~~

除此之外还有 yield break , 其表示结束迭代,跳出循环。不理解,看实例:

static void Main(string[] args)
{
    foreach (int i in Power(2, 8))
    {
        Console.Write("{0} ", i);
    }
    // Output: 2 4 8 16 

    Console.ReadKey();
}

public static System.Collections.IEnumerable Power(int number, int exponent)
{
    int result = 1;
    for (int i = 0; i < exponent; i++)
    {
        result = result * number;
        if (i == 4)
            yield break;
        yield return result;
    }
}

参考文档

  1. https://msdn.microsoft.com/library/9k7k7cf0%28v=vs.110%29.aspx
  2. http://www.cnblogs.com/kingcat/archive/2012/07/11/2585943.html
  3. http://www.cnblogs.com/CareySon/archive/2009/12/16/1625469.html
时间: 2024-10-12 19:43:35

C#关键字:yield的相关文章

Python关键字yield的解释(stackoverflow)

3.1. 提问者的问题 Python关键字yield的作用是什么?用来干什么的? 比如,我正在试图理解下面的代码: def node._get_child_candidates(self, distance, min_dist, max_dist): if self._leftchild and distance - max_dist < self._median: yield self._leftchild if self._rightchild and distance + max_dist

Python关键字yield的解释

yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器. >>> def createGenerator() : ... mylist = range(3) ... for i in mylist : ... yield i*i ... >>> mygenerator = createGenerator() # create a generator >>> print(mygenerator) # mygenerator is a

ES6 新增的关键字 yield

yield是ES6的新关键字使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者.它可以被认为是一个基于生成器的版本的return关键字.  yield关键字实际返回一个IteratorResult对象,它有两个属性,value和done.value属性是对yield表达式求值的结果,而done是false,表示生成器函数尚未完全完成.一旦遇到 yield 表达式,生成器的代码将被暂停运行,直到生 成器的 next() 方法被调用.每次调用生成器的next()方法时,生成器

yield生成器及字符串的格式化

一.生成器 1 def ran(): 2 print('Hello world') 3 yield 'F1' 4 5 print('Hey there!') 6 yield 'F2' 7 8 print('goodbye') 9 yield 'F3' 10 11 ret = ran() # ran()称为生成器函数,ret才是生成器,仅仅具有一种生成能力,函数内部要有关键字yield 12 print(ret) 13 14 res = ret.__next__() #对生成器进行循环操作,遇到y

php5.5新特性之yield理解

今天,在阅读别人代码时,其中出现了一个陌生的关键字yield,想一探究竟,于是找到:http://php.net/manual/zh/language.generators.overview.php yield生成器是php5.5之后出现的,yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低. yield生成器允许你 在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组. 使用示例: /** *

对[foreach]的浅究到发现[yield]

闲来无事,翻了翻以前的代码,做点总结,菜鸟从这里起航,呵呵. 一.List的foreach遍历 先上代码段[1]: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 List<string> dayList = new List<string> { "Sun", "Mon", "Tue", "Wed", "Thr"

C#中的yield return与Unity中的Coroutine(协程)

C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一:yield return <expression>;yield break 看如下例子: 1 public class CustomCollection :IEnumerable { 2 3 public static void Main (string[] args) 4 { 5 Custom

yield python

原文:http://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html 3. (译)Python关键字yield的解释(stackoverflow) 译者: hit9 原文: http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained 译者注: 这是stackoverflow上一个很热的帖子,这里是投票最高的一个答案

node 异步回调解决方法之yield

先看如何使用 使用的npm包为genny,npm 安装genny,使用 node -harmony 文件(-harmony 为使用es6属性启动参数) 启动项目 var genny= require('genny'); genny.run(function* (resume) { console.log("Hello"); yield setTimeout(resume(), 1000); console.log("World"); }); 输出Hello 暂停1秒

yield from

参考:http://aju.space/2017/07/31/Drive-into-python-asyncio-programming-part-1.html yield from  是Python 3.3 新引入的语法(PEP 380). 它主要解决的就是在生成器里玩生成器不方便的问题.它有两大主要功能: 第一个功能是:让嵌套生成器不必通过循环迭代yield,而是直接yield from. 以下两种在生成器里玩子生成器的方式是等价的: # 方式一:使用 yield def gen_two()