news 2026/5/7 7:17:05

c#迭代器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 7:14:56

对比直接使用官方 API 体验 Taotoken 在延迟与稳定性上的优化

使用 Taotoken 聚合服务提升大模型调用体验 1. 从直接调用到聚合服务的转变 许多开发者最初接触大模型 API 时&#xff0c;会选择直接调用厂商提供的官方接口。这种方式虽然直接&#xff0c;但在实际使用中可能会遇到一些挑战。一位长期使用某厂商 API 的开发者分享了转向 Ta…

作者头像 李华
网站建设 2026/5/7 7:14:52

安全加密技能实战指南:从算法原理到密钥管理的最佳实践

1. 项目概述&#xff1a;一个关于“安全加密技能”的实践指南 最近在整理自己的技术工具箱时&#xff0c;发现很多开发者朋友&#xff0c;包括我自己在内&#xff0c;在项目里用到加密功能时&#xff0c;常常是“拿来主义”。从网上找个代码片段&#xff0c;或者调用一个库函数…

作者头像 李华
网站建设 2026/5/7 7:14:47

hamuleite项目解析:Python与Shell脚本自动化工具箱的实践指南

1. 项目概述与核心价值最近在整理个人技术栈和自动化工具时&#xff0c;我又把hoochanlon/hamuleite这个项目翻出来仔细研究了一遍。这是一个在开发者社区里流传了一段时间&#xff0c;但讨论热度不算特别高的项目。它的名字“hamuleite”听起来有点特别&#xff0c;直译过来是…

作者头像 李华
网站建设 2026/5/7 6:58:34

边缘设备3D高斯泼溅优化:内存与计算效率提升实践

1. 边缘设备上的高斯泼溅持续学习优化实践在机器人SLAM和视觉导航领域&#xff0c;3D场景重建技术正面临一个关键转折点。传统基于NeRF的方法虽然重建质量出色&#xff0c;但其动辄数十小时的训练时间让边缘设备望而却步。而3D高斯泼溅&#xff08;3DGS&#xff09;技术的出现&…

作者头像 李华
网站建设 2026/5/7 6:55:31

【 商城系统源码:Java与PHP的区别】

商城系统源码&#xff1a;Java与PHP的区别 开发语言特性 Java是一种强类型、面向对象的编程语言&#xff0c;适合大型复杂系统开发。PHP是一种弱类型、脚本语言&#xff0c;更适合快速开发和中小型项目。Java需要编译后运行&#xff0c;PHP直接解释执行。 性能比较 Java通常运行…

作者头像 李华