新闻中心

C# 怎么使用 yield return 实现迭代器_C# yield return 迭代器使用教程

2025-11-24
浏览次数:
返回列表
yield return 可实现延迟执行,如遍历 GetOddNumbers 时每次按需生成奇数,避免内存浪费。

c# 怎么使用 yield return 实现迭代器_c# yield return 迭代器使用教程

在 C# 中,yield return 是一种简洁高效的方式来实现自定义迭代器,而无需手动创建集合或实现 IEnumerableIEnumerator 接口。它让方法在每次返回一个元素后暂停执行,下次继续从暂停处恢复,非常适合处理大数据集或需要延迟计算的场景。

yield return 基本语法

使用 yield return 的方法必须返回以下类型之一:

  • IEnumerable<t></t>
  • IEnumerator<t></t>
  • IEnumerable
  • IEnumerator

方法中每遇到一次 yield return,就会向枚举器提供一个值,并暂时退出。当枚举器请求下一个元素时,执行从中断处继续。

public static IEnumerable<int> GetNumbers()
{
    yield return 1;
    yield return 2;
    yield return 3;
    yield return 4;
}

调用该方法并遍历:

foreach (int num in GetNumbers())
{
    Console.WriteLine(num);
}
// 输出:
// 1
// 2
// 3
// 4

延迟执行与内存优化

yield return 最大的优势是延迟执行(Lazy Evaluation):元素只在被请求时才生成,而不是一次性全部计算并存储在内存中。

例如,生成 1 到 n 的奇数序列:

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修
public static IEnumerable<int> GetOddNumbers(int max)
{
    for (int i = 1; i <= max; i += 2)
    {
        yield return i;
    }
}

即使 max 是 100 万,也不会占用大量内存,因为数字是按需生成的。

实际应用场景示例

常见用途包括遍历树结构、读取大文件、分页数据等。

比如遍历二叉树的中序序列:

public class TreeNode
{
    public int Value;
    public TreeNode Left;
    public TreeNode Right;
<pre class='brush:php;toolbar:false;'>public IEnumerable<int> InOrder()
{
    if (Left != null)
        foreach (int val in Left.InOrder())
            yield return val;

    yield return Value;

    if (Right != null)
        foreach (int val in Right.InOrder())
            yield return val;
}

}

这种方式代码清晰,且不会一次性构建完整的结果列表。

注意事项与限制

  • 不能在匿名方法、lambda 表达式或 try 块中含有 catch 子句的环境中使用 yield return
  • 可以配合 try-finally 使用,用于资源清理。
  • 方法一旦开始迭代,内部状态由编译器自动生成的状态机管理。
  • 如果多次枚举同一个 yield return 方法结果,每次都会重新执行逻辑。

基本上就这些。合理使用 yield return 能写出更高效、更易读的迭代代码,尤其适合处理流式数据或无限序列。掌握它,能让你的 C# 编程更加灵活。

以上就是C# 怎么使用 yield return 实现迭代器_C# yield return 迭代器使用教程的详细内容,更多请关注其它相关文章!


# 能在  # 汕头营销型网站优化  # 风格化模型网站推广方案  # 监理建设协会网站  # 苏州网站制作与推广  # 百科词条优化网站有哪些  # 美容小店怎么样营销推广  # seo主要做些什么工作  # 台州官网seo优化  # 武汉视频网站优化价格  # 济南企业网站建设怎么样  # 大数据  # 子句  # 是一种  # 扁平化  # 按需  # 怎么处理  # 什么用  # 美图  # 遍历  # 迭代  # c# 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  支付宝如何设置安全保护_支付宝安全设置的全面教程  拼多多赚钱渠道_拼多多收益来源  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  高德地图公交到站提醒失败如何解决 高德提醒权限设置  在Socket.IO连接中实现Access Token自动更新与动态重连  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  Go Martini框架:动态服务解码后的图片内容  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  Animex动漫社网入口地址 Animex动漫社网正版在线入口  响应式容器内容自动缩放与宽高比维持教程  Python多版本共存与虚拟环境管理深度指南  铁路12306的积分有效期是多久_铁路12306积分有效期说明  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  微信网页版官方入口直达 微信网页版网页版登录使用方法  EMS快递官网app_中国邮政速递物流手机客户端  如何在CSS中使用浮动制作导航栏_float实现水平菜单  快速CSGO开箱网站指南 CSGO开箱平台推荐  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  微信网页版官方入口教程 微信网页版网页版快速登录步骤  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  苹果手机如何防止被恶意App追踪  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  《GTA6》开发画面疑似泄露!这次可不是AI了  可靠CSGO开箱平台解析 CSGO开箱网合集  处理嵌套交互式控件:前端可访问性指南  夸克AO3官网入口_AO3镜像网站2025推荐  谷歌推RCS信息存档功能:公司可监控员工私密信息!  Win10双系统截图高效法 截屏快捷键速记【技巧】  初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  AO3最新可访问网址 Archive of Our Own官方在线入口  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  如何在Promise链中优雅地中断后续then执行  J*aScript中在Map循环中检测并处理空数组元素  顺丰国际快递查询 国际件官方查询入口  J*aScript设计模式实践_j*ascript代码优化  大象笔记网页版入口 印象笔记网页版登录入口  在Go Martini框架中高效服务动态生成图像的实践指南  马斯克:Optimus 人形机器人复数形式为 Optimi  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  c++中为什么推荐使用using替代typedef_c++现代化类型别名  C++如何解决segmentation fault_C++段错误调试与原因分析 

搜索