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

C#迭代器方法和yield用法

一.迭代器方法介绍

可使用foreach循环进行遍历的方法,称为迭代器方法。

迭代器方法使用yield return语句返回元素。 到达yield return语句时,会记住当前在代码中的位置。 下次调用迭代器函数时,将从该位置开始执行。换言之,如果语句中出现yield关键字,则意味着它出现的方法是迭代器方法。

在以下示例中,foreach 循环的首次迭代使 SomeNumbers 迭代器方法执行,直至到达第一个 yield return 语句。 此迭代返回的值为 3,并保留当前在迭代器方法中的位置。 在循环的下次迭代中,迭代器方法的执行将从其暂停的位置继续,直至到达 yield return 语句后才会停止。 此迭代返回的值为 5,并再次保留当前在迭代器方法中的位置。 到达迭代器方法的结尾时,循环完成。

    class MainClass{public static IEnumerable SomeNumbers(){yield return 3;yield return 5;yield return 8;}static void Main(){foreach (int number in SomeNumbers()){Console.Write(number.ToString() + " ");}}}/* Output:3 5 8*/

迭代器方法的返回类型必须为IEnumerable,IEnumerator,IEnumerable<T>或IEnumerator<T>。可以使用yield break语句来终止迭代。

在迭代器方法中除了yield return外,不允许出现普通的return语句。

二.通过迭代器方法快速创建迭代器

在下例中,如果不使用yield return语法,则需创建一个类实现IEnumerator接口,实现MoveNext、Current和reset方法。可见yield是一种语法糖,简化了创建迭代器的复杂性。

    public class DaysOfTheWeek : IEnumerable{private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };public IEnumerator GetEnumerator(){for (int index = 0; index < days.Length; index++){// Yield each day of the week.yield return days[index];}}}class MainClass{static void Main(){DaysOfTheWeek days = new DaysOfTheWeek();foreach (string day in days){Console.Write(day + " ");}// Output: Sun Mon Tue Wed Thu Fri SatConsole.ReadKey();}}

http://www.lryc.cn/news/434950.html

相关文章:

  • 斗破C++编程入门系列之二十六:数组、指针和字符串:动态内存分配和释放(一星斗师)
  • Servlet 和 Spring Boot 的请求处理流程区别和例子
  • C++笔记之map的实用操作
  • Lombok失效:报错 找不到符号 Springboot项目
  • Linux 基础命令-文件与目录操作
  • Delphi 12.1安卓APP开发中获取硬件信息及手机号
  • STM32 - 笔记4
  • 【H2O2|全栈】更多关于HTML(1)HTML进阶(一)
  • 新160个crackme - 053-devilz KeyGen me#3
  • ORA-12514
  • MyBatis-PlusDruid数据源
  • C#中chart绘制曲线
  • c++数据结构算法题讲解
  • 间隙锁在其他数据库管理系统中的类似实现
  • OpenCV 与 YoloV3的结合使用:目标实时跟踪
  • Worse is Better
  • Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术
  • 【Qt网络编程基础】Tcp服务器和客户端(只支持一对一)
  • 平台开发到落地详解:从食堂采购系统源码到可视化供应链管理数据大屏
  • 静态内部类
  • Vue+SpringBoot+数据库整体开发流程 1
  • 百度Apollo打通与ROS的通信,扩展自动驾驶系统生态
  • Web3 项目安全手册
  • AI边缘计算在安防领域的智能化革新:赋能安防系统的智能化升级
  • vscode配置C/C++环境(保姆级详细教程)
  • MDK keil STM32 局部变量不能查看值,显示为not in scope
  • 表连接查询之两个left join与递归SQL
  • 2024.9.10
  • 22_图论中的高级数据结构
  • axure判断