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

c#迭代器

一、迭代器

迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式

迭代器模式提供一个方法顺序访问一个聚合对象中的各个元素

而又不暴露其内部的标识

二 标准迭代器的实现方法

关键接口:IEnumerator,IEnumerable

命名空间:using System.Collections;

可以通过同时继承IEnumerable和IEnumerator实现其中的方法

IEnumerable表示一个可被遍历的集合(如数组、列表、字典等)

GetEnumerator(),返回一个IEnumerator对象。

实现该接口的类:可以用于foreach循环。

IEnumerator表示遍历过程中的“游标”,记录当前遍历位置,并提供移动下一个、获取当前元素的能力。

核心成员object Current:获取当前位置的元素。

bool MoveNext():将游标移到下一个元素,如果成功返回true,到达末尾返回false

void Reset():将游标重置到初始位置(位于第一个元素之前)。

class CustomList : IEnumerable, IEnumerator { private int[] list; //从-1开始的光标 用于表示 数据得到了哪个位置 private int position = -1; public CustomList() { list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; } #region IEnumerable public IEnumerator GetEnumerator() { Reset(); return this; } #endregion public object Current { get { return list[position]; } } public bool MoveNext() { //移动光标 ++position; //是否溢出 溢出就不合法 return position < list.Length; } //reset是重置光标位置 一般写在获取 IEnumerator对象这个函数中 //用于第一次重置光标位置 public void Reset() { position = -1; } }

三 用yield return 语法糖实现迭代器

yield return 是C#提供给我们的语法糖
所谓语法糖,也称糖衣语法
主要作用就是将复杂逻辑简单化,可以增加程序的可读性
从而减少程序代码出错的机会

关键接口:IEnumerable
命名空间:using System.Collections;
让想要通过foreach遍历的自定义类实现接口中的方法GetEnumerator即可

class CustomList2 : IEnumerable { private int[] list; public CustomList2() { list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; } public IEnumerator GetEnumerator() { for (int i = 0; i < list.Length; i++) { yield关键字 配合迭代器使用 可以理解为 暂时返回 保留当前的状态 一会还会在回来 C#的语法糖 yield return list[i]; } yield return list[7]; } }

四、用yield return 语法糖为泛型类实现迭代器

class CustomList<T> : IEnumerable { private T[] array; public CustomList(params T[] array) { this.array = array; } public IEnumerator GetEnumerator() { for (int i = 0; i < array.Length; i++) { yield return array[i]; } }

五 foreach的本质

foreach本质
1.先获取in后面这个对象的 IEnumerator
会调用对象其中的GetEnumerator方法 来获取
2.执行得到这个IEnumerator对象中的 MoveNext方法
3.只要MoveNext方法的返回值时true 就会去得到Current
然后复制给 item

foreach (int item in list) { Console.WriteLine(item); } foreach (int item in list) { Console.WriteLine(item); }
http://www.jsqmd.com/news/768653/

相关文章:

  • EMC(电磁兼容性)
  • 开题报告总被导师打回?虎贲等考 AI:一键生成规范开题,逻辑完整一次通过
  • 快速验证脚本逻辑:在快马平台原型化你的智能gitbash仓库管理工具
  • AGI 内生安全基座:RAE 架构的攻防实录
  • 从Detect到L0:手把手拆解PCIe链路训练状态机LTSSM的完整流程
  • OpenClaw SovereignShield插件:为AI代理构建确定性安全防线
  • 【Docker 27工业级集群部署终极指南】:20年SRE亲授零失误容器编排落地代码与避坑清单
  • srcpack:开发者必备的源码打包工具,自动化过滤与标准化分发
  • 让AI替你思考,基于快马平台智能生成下一代acciowork自动化决策脚本
  • iFlow终端美化框架oh-my-iflow:模块化设计与性能调优指南
  • 信创实践|政务云零中断迁移落地:基于光润通Bypass网卡的技术实现
  • 内蒙古医科大学考研辅导班机构推荐:排行榜单与哪家好评测 - michalwang
  • ChatGPT长文本处理插件:突破上下文限制的自动化对话编排方案
  • Web弱口令漏洞:攻击者的“金钥匙”与防御全解析
  • STM32CubeMX配置GPIO输入时,上拉/下拉电阻到底怎么选?一个按键电路原理图讲明白
  • DLP数据防泄漏系统都有哪些?分享七个常用的DLP数据防泄漏系统,码住
  • NsEmuTools:三分钟搞定NS模拟器安装与管理的终极解决方案
  • WindowsCleaner:你的Windows系统清洁专家,告别C盘爆红的烦恼
  • Git 大仓库下载终极指南:告别克隆失败,实现断点续传
  • ML:随机森林的基本原理与实现
  • 沈阳建筑大学考研辅导班机构推荐:排行榜单与哪家好评测 - michalwang
  • Arm Cortex-R82寄存器架构与定时器控制详解
  • 【高级网络】虚拟化与云计算 (Virtualization Cloud) 深度解析
  • astral-sh发布的musl和gnu版本standalone python 性能比较
  • 用一颗6脚5050RGB灯珠,我复刻了同事那个超省资源的跑马灯+呼吸灯方案
  • 蓝桥杯单片机CT107D平台:用PCF8591的DAC做个简易数字电压表(附完整代码)
  • Spring学习(六)
  • 基于Alexa与Node.js的智能DNS查询技能开发实战
  • 西南林业大学考研辅导班机构推荐:排行榜单与哪家好评测 - michalwang
  • 别再死磕手册了!Xilinx 7系列FPGA配置模式选型指南(SPI/BPI/SelectMAP/JTAG)