当前位置: 首页 > news >正文

1.1.2 简化迭代器 yield return的使用

   yield return 是一个用于简化迭代器(Iterator)实现的关键字组合。它的核心作用是让开发者能够以更简洁的方式定义一个按需生成序列的方法(生成器方法),而无需显式实现 IEnumerable 或 IEnumerator 接口。yield return 方法会在每次迭代时按需生成下一个值,而不是一次性生成所有结果。

核心概念

  1. 延迟执行(Lazy Evaluation)
    使用 yield return 的方法会在每次迭代时按需生成下一个元素,而不是一次性生成所有元素并存储在内存中。这对处理大数据集或无限序列非常有用。

  2. 状态机(State Machine)
    编译器会自动将 yield return 方法转换为一个状态机,记录当前执行的位置。每次调用 MoveNext()(例如在 foreach 循环中)时,代码会从上一次 yield return 的位置继续执行。

  3. 返回值类型
    yield return 方法必须返回 IEnumerable<T> 或 IEnumerator<T> 类型。

例1:生成一个数字序列

public class Program
{static void Main(){// 调用生成器方法,但此时不会立即执行所有代码IEnumerable<int> numbers = GenerateNumbers(3);// 开始迭代时,按需生成值foreach (int num in numbers){Console.WriteLine(num); // 依次输出 0, 1, 2}}// 生成器方法:按需生成 0 到 max-1 的数字static IEnumerable<int> GenerateNumbers(int max){for (int i = 0; i < max; i++){yield return i; // 每次迭代返回一个值,并暂停执行}}
}

例2:过滤集合中的偶数

public static IEnumerable<int> FilterEven(IEnumerable<int> numbers)
{foreach (int num in numbers){if (num % 2 == 0){yield return num; // 按需返回符合条件的值}}
}// 使用:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
foreach (int even in FilterEven(numbers))
{Console.WriteLine(even); // 输出 2, 4
}

例3:关于yield return 与普通方法的内存占用对比

 下面的代码GetNumbers方法一次性把所有数据都产生,内存占用与count成线性关系。

而GenerateNumbers 调用时才产生一个数字,内存占用小。

List<int> GetNumbers(int count)
{List<int> list = new List<int>();for (int i = 0; i < count; i++){list.Add(i);}return list; // 内存占用:O(n)
}

IEnumerable<int> GenerateNumbers(int count)
{for (int i = 0; i < count; i++){yield return i; // 内存占用:O(1)}
}
http://www.xdnf.cn/news/316405.html

相关文章:

  • 音乐网站|基于SprinBoot+vue的音乐网站(源码+数据库+文档)
  • RPA与After Effects 2024深度融合:自动化影视特效全链路革命
  • ESP32蓝牙开发笔记(十五)
  • 开发 Chrome 扩展中的侧边栏图标设置实录(Manifest V3)
  • [特殊字符] Milvus + LLM大模型:打造智能电影知识库系统
  • Python入门(二)
  • 融合静态图与动态智能:重构下一代智能系统架构
  • 2025年渗透测试面试题总结-渗透岗位全职工作面试(附回答)(题目+回答)
  • 【Redis】哨兵机制和集群
  • MATLAB的cvpartition函数用法
  • AI辅助DevOps与自动化测试:重构软件工程效率边界
  • stm32之ADC
  • 什么是智能合约?区块链上的自动化契约
  • 文章记单词 | 第67篇(六级)
  • ​​大疆无人机SDR 链路​​
  • 28. C++位图 布隆过滤器 哈希切割相关
  • PostgreSQL 系统管理函数详解
  • Rest架构解说
  • idea里maven自定义的setting.xml文件不生效问题
  • 基于DR模式的LVS集群案例
  • AI检测的荒谬性:当规则沦为一场概率游戏
  • LLaMA-Omni 2:基于 LLM 的自回归流语音合成实时口语聊天机器人
  • 单片机-STM32部分:6、不同编程方式-寄存器、标准库、HAL库、LL库
  • 中间件-RocketMQ
  • k8s | Kubernetes 服务暴露:NodePort、Ingress 与 YAML 配置详解
  • 【代码优化篇】强缓存和协商缓存
  • ABP-Book Store Application中文讲解 - 前期准备 - Part 2:创建Acme.BookStore + Angular
  • 【ArcGIS Pro微课1000例】0068:Pro原来可以制作演示文稿(PPT)
  • 理解与清理 Docker 中的悬空镜像(Dangling Images)
  • 8.12 GitHub Sentinel企业级进化:容器化优化×AI监控,效率提升300%实战