[C#2] 5-迭代器
1.枚举数
枚举数是循环访问其关联集合的对象。它可被视作指向集合中任何元素的可移动的指针。 一个枚举数只能与一个集合关联,但一个集合可以具有多个枚举数。C#的foreach 语句使用枚举数并隐藏操作该枚举数的复杂性。枚举数可用于读取集合中的数据,但不能用于修改基础集合。
集合要支持foreach则需要实现System.Collections.IEnumerable接口[公开枚举数,该枚举数支持在非泛型集合上进行简单迭代, 也可以不实现该接口,该接口定义了一个方法GetEnumerator(),返回一个支持IEnumerator接口的对象,IEnumerator的成员如下:
名称 | 说明 |
---|---|
bool MoveNex t方法 | 将枚举数推进到集合的下一个元素 |
void Rese t方法 | 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前 |
object Current 属性 | 获取集合中的当前元素 |
写一个:
1 2 public class MyCollections : IEnumerable 3 { 4 private string[] items; 5 MyCollections(string[] items) 6 { 7 this.items = items; 8 } 9 public IEnumerator GetEnumerator() 10 { 11 return new MyEnumerator(this); 12 } 13 public class MyEnumerator : IEnumerator 14 { 15 private int position = -1; 16 private MyCollections mc; 17 public MyEnumerator(MyCollections mc) 18 { 19 this.mc = mc; 20 } 21 public bool MoveNext() 22 { 23 if (position < this.mc.items.Length - 1) 24 { 25 position++; 26 return true; 27 } 28 else 29 { 30 return false; 31 } 32 } 33 public void Reset() 34 { 35 position = -1; 36 } 37 object IEnumerator.Current 38 { 39 get 40 { 41 return this.mc.items[position]; 42 } 43 } 44 } 45 static void Main() 46 { 47 MyCollections f = new MyCollections( 48 new string[] { "乱舞春秋", "男", "22" }); 49 foreach (string item in f) 50 { 51 Console.WriteLine(item); 52 } 53 } 54 }
2.迭代器
C#2.0以前,要使自己的集合支持foreach遍历,需要写上面一大堆代码[实现两个接口,也可不实现, 但是必须给提供这两个接口中的同名方法],C#2.0引入了yield return[返回每个元素]和yield break[终止迭代]两个组合而成的上下文关键字。 改写上述代码:
//MyEnumerable方法全部删掉 public IEnumerator GetEnumerator() { for (int i = 0; i < items.Length; i++) { yield return items[i]; } }
就是这么简单!只需实现一个接口IEnumerable就可以了[或者说有public IEnumerator GetEnumerator()此方法就可];
像是匿名方法一样,编译器帮我们做了很多[这里编译器帮我们生成了"实现IEnumerator接口的一个类",通过查看IL代码得知]。
作者:Blackheart
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义