当前位置: 首页 > 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)}
}

相关文章:

  • Flutter Drawer 详解
  • 《人工智能:如何重塑教育模式与学习图景》
  • 深入理解Java反射机制
  • C语言回调函数初始化与触发方法
  • 【存储管理—动态不等长存储资源分配算法】
  • 实验一:Linux静态路由
  • JavaScript性能优化:从青铜到王者的进阶之路
  • pip安装包时出现网络问题的坑
  • MCPHub:一站式MCP服务器聚合平台
  • 摄像头模组RGB/IR模组
  • C++初阶-string类的简单应用
  • 这些单词有什么内在联系吗?
  • 【AI】关于模型部署方案MindIE Server和vllm
  • uni-app 引入vconsole web端正常,安卓端报错 Cannot read property ‘sendBeacon‘ of undefined
  • 【25软考网工】第五章(8)路由协议RIP、OSPF
  • 深入理解 Node.js 模块化(CommonJS):原理、用法与避坑指南
  • 一文走进GpuGeek | conda常用命令
  • STM32开发GPIO
  • 【JMeter技巧】GET请求如何传递Body参数?版本兼容性详解场景需求
  • ✨WordToCard使用分享✨
  • 宇数科技王兴兴:第一桶金来自上海,欢迎上海的年轻人加入
  • 巴基斯坦关闭全部领空
  • 欧洲理事会前主席米歇尔受聘中欧国际工商学院特聘教授,上海市市长龚正会见
  • 代理销售保险存在误导行为,农业银行重庆市分行相关负责人被罚款0.1万元
  • 陕西永寿4岁女童被蜜蜂蜇伤致死,当地镇政府介入处理
  • 奥园集团将召开债券持有人会议,拟调整“H20奥园2”本息兑付方案