深入理解C#中的yield关键字:提升迭代性能与效率

news2024/12/24 2:56:26

文章目录

  • 前言
  • 一、yield return
  • 二、yield break
  • 总结


前言

    在C#中,yield 关键字是特别用于迭代器块和方法中的,它允许你逐个返回序列中的元素,而不是一次性返回整个集合。使用 yield 可以显著提高处理大数据集或进行复杂迭代时的性能和内存效率,因为它允许按需生成和返回数据,而不是预先生成整个数据集。


一、yield return

    yield return 语句用于在迭代器块中返回一个元素,并且每次迭代时只执行到下一个 yield return 语句或迭代器块的末尾。当迭代器块执行完毕时,迭代结束。

public static IEnumerable<int> GetNumbers()  
{  
    for (int i = 0; i < 10; i++)  
    {  
        yield return i;  
    }  
}  
  
// 使用  
foreach (var number in GetNumbers())  
{  
    Console.WriteLine(number);  
}

    GetNumbers 方法使用 yield return 逐个返回从0到9的数字。每次迭代调用 GetNumbers() 方法时,它都会从上次停止的地方继续执行,直到所有数字都被返回。

二、yield break

    yield break 语句用于提前退出迭代器块。如果在迭代器块中遇到 yield break 语句,迭代器将停止执行,并且不会返回任何更多的元素。

public static IEnumerable<int> GetNumbersUpTo(int limit)  
{  
    for (int i = 0; i < limit; i++)  
    {  
        if (i == 5) // 假设我们只想要前5个数字  
        {  
            yield break;  
        }  
        yield return i;  
    }  
}  
  
// 使用  
foreach (var number in GetNumbersUpTo(10))  
{  
    Console.WriteLine(number);  
}

    GetNumbersUpTo 方法在返回第5个数字后立即使用 yield break 退出迭代器块,因此不会返回任何超过5的数字。


总结

注意事项:

  • 含有 yield return 语句的方法必须返回 IEnumerable、IEnumerable、IEnumerator 或 IEnumerator。
  • 迭代器块不能包含 return 语句,除非该语句后面紧跟一个 yield break(在这种情况下,它实际上并不返回任何值)。
  • 使用 yield 可以使代码更加简洁,并且可以提高处理大数据集时的性能。然而,它也有一些限制,比如不能用于非迭代器的上下文中,且不能用于异步方法中(C# 5.0及之前版本)。不过,从C# 8.0开始,引入了异步迭代器(async iterators),允许你在异步方法中使用 yield return 和 await。

不能使用 yield 的情况:

  • yield return 不能套在 try-catch 中。
  • yield break 不能放在 finally 中。
  • yield 不能用在带有 in、ref 或 out 参数的方法。
  • yield 不能用在 Lambda 表达式和匿名方法。
  • yield 不能用在包含不安全的块(unsafe)的方法。

“笑对人生,智慧同行!博客新文出炉,微信订阅号更新更实时,等你笑纳~”
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构初阶】队列经典习题两道

hello&#xff01; 我是云边有个稻草人 目录 一、用队列实现栈 二、用栈实现队列 Relaxing Time &#xff01; 正文开始—— 一、用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 根据题目要求&#xff0c;我们要用两个队列来实现栈的相关功能&…

虚拟机上使用Ubuntu1804上编译qt5.12.9部署到jetson nano上

开发qt界面&#xff0c;基于Qt5.12.9&#xff0c;开发环境使用虚拟机加载Ubuntu1804&#xff0c;开发完成后的qt程序最后部署到jetson nano上&#xff0c;使用的通用编译器是gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu 安装编译器 本文中直接将gcc-linaro-7.5.0-2019.…

汇昌联信做拼多多店铺如何运营?

汇昌联信如何在拼多多上运营店铺&#xff0c;是许多电商新手和希望扩展市场的商家所关注的问题。在这个快速发展的电商平台上&#xff0c;掌握正确的运营策略&#xff0c;对于提升店铺销量、增强品牌影响力至关重要。接下来&#xff0c;我们将详细探讨如何有效运营拼多多店铺。…

Angular由一个bug说起之九:AWS S3 文件下载问题

引言 在现代 Web 开发中&#xff0c;我们经常需要处理来自全球不同地区的数据&#xff0c;这包括文件名中可能包含的非拉丁文字符。最近&#xff0c;在一个项目中&#xff0c;我们遇到了一个与 Amazon S3 服务相关的挑战&#xff0c;涉及到文件名编码的处理。当从 S3 下载文件…

Redis分布式部署方式-主从复制

分布式部署Redis方式 分布式系统&#xff0c;涉及到一个非常关键的问题&#xff1a;单点问题 单点问题&#xff1a;如果某个服务器&#xff0c;只有一个节点&#xff08;只搞一个物理服务器&#xff0c;来部署这个服务器程序&#xff09;&#xff0c;会遇到一些困难&#xff…

多线程学习之ThreadLocal详细笔记

ThreadLocal详细笔记 一、ThreadLocal的基本概念二、ThreadLocal的独特性2.1 数据访问方式2.2 线程安全实现2.3 适用场景 三、ThreadLocal 的简单使用四、ThreadLocal 的工作原理五、ThreadLocal和内存泄漏的关系5.1 ThreadLocalMap的Entry的Key设计成弱引用5.2 弱引用会导致内…

超简单4行代码-STM32F103的HAL实现有源蜂鸣器报警

1、概述 在嵌入式项目开发中&#xff0c;使用蜂鸣器作为简单的报警或提示装置非常常见。根据不同的应用场景&#xff0c;我们可能会选择有源蜂鸣器或无源蜂鸣器。本文将重点介绍如何通过STM32F103系列单片机&#xff0c;利用HAL库&#xff0c;仅通过4行代码实现对有源蜂鸣器的…

django学习入门系列之第九点《初识MySQL》

文章目录 9.1 初识网站9.2 初识MySQL下载安装创建配置文件初始化启动MySQL服务进入mysql查看已有文件夹退出&#xff08;关闭连接&#xff09;忘记密码 往期回顾 9.1 初识网站 Python相关:基础、函数、数据类型、面向、模块。前端开发直观:HTML、CSS、JavaScript、jQuery:[静态…

【运维】JetBrains Gateway (Pycharm) SSH免密连接,改为免密连接

一直要求输入密码&#xff0c;很烦人&#xff1a; 如何免密连接&#xff1f; 1 重新打开gateway&#xff0c;来到这个界面点新建连接&#xff1a; 2 点这里设置&#xff1a; 3 在这一页&#xff0c;你可以改你的所有配置&#xff0c;只要设置为password并且保存密码&…

详解Redis 高可用的方式 Redis Cluster

Redis 高可用方式 Redis 提供了多种高可用性方案&#xff0c;主要包括以下几种方式&#xff1a; 主从复制&#xff08;Replication&#xff09; 主从复制是最基本的高可用性方案&#xff0c;通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…

数据结构--数据结构概述

一、数据结构三要素 1. 数据的逻辑结构 数据的逻辑结构是指数据元素之间的关系和组织方式&#xff0c;通常分为线性结构和非线性结构。 线性结构&#xff1a;例如线性表&#xff0c;其中数据元素按照顺序排列&#xff0c;彼此之间存在一对一的关系。 非线性结构&#xff1a;…

android车载手机互联投屏新专题-实战作业布置

背景&#xff1a; 学习了马哥的投屏实战开发课程后&#xff0c;大家都可以实现如下图一样的手机车机多端互联的投屏场景。 即已经实现了手机和车机投屏互动&#xff0c;车机上手机画面屏幕可以与手机实体屏幕一样就是常见的Mirror模式&#xff0c;如果不一样就是课程里面讲的扩…

解析网络流量管理方案:简化基于云的DNS负载均衡

数字化时代&#xff0c;网络规模和流量需求的增长&#xff0c;催生了用户对可用性的需求、管理员对更好的访问和管理等需求。在大型的网络应用中&#xff0c;为保障站点的稳定性&#xff0c;会为服务或站点提供多台服务器&#xff0c;以平均分配每台服务器上的压力&#xff0c;…

上门做饭小程序项目源码功能介绍

上门做饭小程序通常包含以下功能&#xff0c;以便用户方便地享受到上门做饭的服务&#xff1a; 用户注册与登录&#xff1a;允许用户创建账户并登录&#xff0c;管理个人信息和偏好。 菜品浏览与选择&#xff1a;提供各种菜品的列表或菜单&#xff0c;用户可以浏览菜品详情、价…

C++STL详解(五)——list类的具体实现

一.本次所需实现的三个类及其成员函数接口 链表首先要有结点&#xff0c;因此我们需要实现一个结点类。 链表要有管理结点的结构&#xff0c;因此我们要有list类来管理结点。 链表中还要有迭代器&#xff0c;而迭代器的底层其实是指针。但是我们现有的结点类无法完成迭代器的…

在VB.net中,对数据排名次,用LINQ、SortedSet,还是用SortedList速度快

标题 在VB.net中&#xff0c;对数据排名次&#xff0c;用LINQ、SortedSet&#xff0c;还是用SortedList速度快 正文 在VB.NET中&#xff0c;选择最适合你需求的排序和索引方法时&#xff0c;需要考虑到数据的规模、是否需要频繁地更新数据结构、以及是否只需要排序结果或还需要…

【Hadoop】建立圈内组件的宏观认识

01存储02计算03调度04其他05回忆 众多组件们构建了大规模分布式计算和存储平台。本文介绍Hadoop生态圈中各个组件的主要功能和作用&#xff0c;辅助学者理解每个组件的定位和用途&#xff0c;从而建立对圈内组件的宏观认识。梳理清楚HDFS、MapReduce、YARN、Hive、HBase、Spark…

【大模型系列篇】Transformers综述--邱锡鹏

论文标题&#xff1a;A Survey of Transformers 论文作者&#xff1a;Tianyang Lin, Yuxin Wang, Xiangyang Liu, Xipeng Qiu 论文链接&#xff1a;https://arxiv.org/abs/2106.04554 Transformer 在许多人工智能领域&#xff08;如自然语言处理、计算机视觉和音频处理&#…

【区块链+金融服务】山西省信易贷平台 | FISCO BCOS应用案例

2022 年 8 月 8 日&#xff0c;山西省发展改革委按照国家的顶层设计&#xff0c;指导山西股权交易中心建设山西省信易贷平台&#xff0c;包 括三个子平台&#xff1a;一是建设集金融产品超市、融资需求精准匹配、融资监测等于一体的山西省融资综合信用服务平台&#xff1b; 二是…

微信小程序--25(WXSS模板样式了解)

一、WXSS和CSS关系 大部分特性相同 1.wxss独有 rpx尺寸单位import 样式导入 二、rpx 1.原理 rpx将所有屏幕宽度等分为750份&#xff0c;自动换成像素实现屏幕适配 2.rpx与px之间换算 约分计算不同设备比例不同 三、样式导入 1.语法 importt”相对路径“&#xff1b;…