首页 > 其他分享 >yield 语句 - 提供下一个元素

yield 语句 - 提供下一个元素

时间:2024-04-20 22:44:05浏览次数:26  
标签:语句 return 迭代 int 元素 yield Console

yield 语句 - 提供下一个元素

 

本文内容

  1. 迭代器的执行
  2. C# 语言规范
  3. 另请参阅

迭代器中使用 yield 语句提供下一个值或表示迭代结束。 yield 语句有以下两种形式:

  • yield return:在迭代中提供下一个值,如以下示例所示:

    C#
    foreach (int i in ProduceEvenNumbers(9))
    {
        Console.Write(i);
        Console.Write(" ");
    }
    // Output: 0 2 4 6 8
    
    IEnumerable<int> ProduceEvenNumbers(int upto)
    {
        for (int i = 0; i <= upto; i += 2)
        {
            yield return i;
        }
    }
    
  • yield break:显式示迭代结束,如以下示例所示:

    C#
    Console.WriteLine(string.Join(" ", TakeWhilePositive([2, 3, 4, 5, -1, 3, 4])));
    // Output: 2 3 4 5
    
    Console.WriteLine(string.Join(" ", TakeWhilePositive([9, 8, 7])));
    // Output: 9 8 7
    
    IEnumerable<int> TakeWhilePositive(IEnumerable<int> numbers)
    {
        foreach (int n in numbers)
        {
            if (n > 0)
            {
                yield return n;
            }
            else
            {
                yield break;
            }
        }
    }
    

    当控件到达迭代器的末尾时,迭代也结束。

在前面的示例中,迭代器的返回类型为 IEnumerable<T>(在非泛型情况下,使用 IEnumerable 作为迭代器的返回类型)。 还可以使用 IAsyncEnumerable<T> 作为迭代器的返回类型。 这使得迭代器异步。 使用 await foreach 语句对迭代器的结果进行迭代,如以下示例所示:

C#
await foreach (int n in GenerateNumbersAsync(5))
{
    Console.Write(n);
    Console.Write(" ");
}
// Output: 0 2 4 6 8

async IAsyncEnumerable<int> GenerateNumbersAsync(int count)
{
    for (int i = 0; i < count; i++)
    {
        yield return await ProduceNumberAsync(i);
    }
}

async Task<int> ProduceNumberAsync(int seed)
{
    await Task.Delay(1000);
    return 2 * seed;
}

迭代器的返回类型可以是 IEnumerator<T> 或 IEnumerator。 在以下场景中实现 GetEnumerator 方法时,这非常有用:

  • 设计实现 IEnumerable<T> 或 IEnumerable 接口的类型。

  • 添加实例或扩展GetEnumerator方法来使用 foreach语句对类型的实例启用迭代,如以下示例所示:

    C#
    public static void Example()
    {
        var point = new Point(1, 2, 3);
        foreach (int coordinate in point)
        {
            Console.Write(coordinate);
            Console.Write(" ");
        }
        // Output: 1 2 3
    }
    
    public readonly record struct Point(int X, int Y, int Z)
    {
        public IEnumerator<int> GetEnumerator()
        {
            yield return X;
            yield return Y;
            yield return Z;
        }
    }
    

不能在下列情况中使用 yield 语句:

迭代器的执行

迭代器的调用不会立即执行,如以下示例所示:

C#
var numbers = ProduceEvenNumbers(5);
Console.WriteLine("Caller: about to iterate.");
foreach (int i in numbers)
{
    Console.WriteLine($"Caller: {i}");
}

IEnumerable<int> ProduceEvenNumbers(int upto)
{
    Console.WriteLine("Iterator: start.");
    for (int i = 0; i <= upto; i += 2)
    {
        Console.WriteLine($"Iterator: about to yield {i}");
        yield return i;
        Console.WriteLine($"Iterator: yielded {i}");
    }
    Console.WriteLine("Iterator: end.");
}
// Output:
// Caller: about to iterate.
// Iterator: start.
// Iterator: about to yield 0
// Caller: 0
// Iterator: yielded 0
// Iterator: about to yield 2
// Caller: 2
// Iterator: yielded 2
// Iterator: about to yield 4
// Caller: 4
// Iterator: yielded 4
// Iterator: end.

如前面的示例所示,当开始对迭代器的结果进行迭代时,迭代器会一直执行,直到到达第一个 yield return 语句为止。 然后,迭代器的执行会暂停,调用方会获得第一个迭代值并处理该值。 在后续的每次迭代中,迭代器的执行都会在导致上一次挂起的 yield return 语句之后恢复,并继续执行,直到到达下一个 yield return 语句为止。 当控件到达迭代器或 yield break 语句的末尾时,迭代完成。

C# 语言规范

有关详细信息,请参阅 C# 语言规范中的 yield 语句部分。

另请参阅

     在 GitHub 上与我们协作 可以在 GitHub 上找到此内容的源,还可以在其中创建和查看问题和拉取请求。 有关详细信息,请参阅参与者指南

.NET 反馈

.NET 是一个开放源代码项目。 选择一个链接以提供反馈:

 提出文档问题 提供产品反馈

标签:语句,return,迭代,int,元素,yield,Console
From: https://www.cnblogs.com/sexintercourse/p/18148330

相关文章

  • 52条SQL语句性能优化策略,建议收藏
    52条SQL语句性能优化策略,建议收藏Bug哥不定时发布Java类技术文​关注 585人赞同了该文章本文会提到52条SQL语句性能优化策略。1、对查询进行优化,应尽量避免全表扫描,首先应考虑在WHERE及ORDERBY涉及的列上建立索引。2、应尽量避免在WHERE......
  • c# .net core 将对应的语句转成dsl
    痛点:遇到一个问题,代码嵌套的es查询逻辑,太乱,太复杂。通过代码直观人工去转dsl发现根本不可能。后老看到调试模式能拿到dsl,方法如下https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/debug-mode.html使用debug模式,按文档的设置。设置完成之后,按文档https:......
  • ts中的dom元素和event事件类型声明
    1,HTMLElement和Element<divid="divClick"></div>constdocu=document.getElementById('divClick');constdocu1=document.querySelector('#divClick');把鼠标分别放在docu和docu1上:HTMLElementHTMLElement......
  • 判断字符串是否包含数组中的元素
    php怎样简易地判断字符串是否包含数组中的元素呢,折腾了一晌未果。从php内置的字符串函数和数组函数,没见到直接的方法,只有自行循环判断。方法一:循环数组,使用strstr函数判断其中元素是否被包含在字符串中,有则退出循环,输出true,没则循环到底,输出false。亮点是代码直观,遇到true就退出......
  • 实验6循环结构程序设计(for语句的应用)
    实验6循环结构程序设计(for语句的应用)一、实验目的1.熟练掌握三种循环语句并能正确运用;2.能够用循环实现一些常用算法,如穷举法,迭代法,递推法等;3.进一步学习程序调试;4.了解中国算法,百钱买百鸡。二、实验硬、软件环境Windows计算机、Devc6.0三、实验内容及步骤实验内容:项目......
  • 实验5循环结构程序设计(while、do-while语句的应用)
    实验5循环结构程序设计(while、do-while语句的应用)一、实验目的1.熟练掌握三种循环语句并能正确运用;2.能够用循环实现一些常用算法,如穷举法,迭代法,递推法等;3.进一步学习程序调试;4.了解中国算法,百钱买百鸡。二、实验硬、软件环境Windows计算机、Devc6.0三、实验内容及步骤项......
  • 让一个元素在网页上跟随网页窗口大小变化始终保持上下左右居中
    ​ 废话少说,直接上代码,懂的都懂:<!DOCTYPEhtml><htmlstyle="font-size:100px;"><head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> <styletype="text/css"> *{margin:0......
  • 【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句
    问题描述在为APIM服务配置了诊断日志(DiagnosticSetting),把日志收集在LogAWorkspace中,需要验证日志中是否能查看到请求的错误信息。所以想人为的来制造一些错误。经过网络搜索,参考Policy的文档介绍后,完成了以下3种错误 第一种:使用 return-response返回指定错误码retu......
  • 为什么python的数据库语句要用参数化构造的方式
    以下是一个python的数据库插入语句self.cur.execute('''INSERTINTObooks(url,title,product_type,price_excl_tax,price_incl_tax,availability,num_reviews,rating,category,describe)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)&......
  • 游游的元素修改(携程24秋招研发岗第一批)
    题面游游的元素修改游游拿到了一个数组,她每次操作可以使得一个元素加1,另一个元素减1。游游希望最终数组的每个元素大小都在[l,r]范围内,她想知道自己最少多少次操作可以达成目标?输入第一行输入一个正整数t,代表用例的组数。对于每组用例:第一行输入三个正整数n,l,r。第二行输......