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

49、c# 能⽤foreach 遍历访问的对象需满足什么条件?

在 C# 中,要使用 foreach 循环遍历一个对象,该对象必须满足以下条件之一:

1. 实现 IEnumerable 或 IEnumerable 接口

  • 非泛型版本:System.Collections.IEnumerable
public class MyCollection : IEnumerable
{private int[] _data = { 1, 2, 3 };public IEnumerator GetEnumerator(){return _data.GetEnumerator();}
}
  • 泛型版本:System.Collections.Generic.IEnumerable(推荐)
public class MyCollection<T> : IEnumerable<T>
{private List<T> _data = new List<T>();public IEnumerator<T> GetEnumerator(){return _data.GetEnumerator();}IEnumerator IEnumerable.GetEnumerator() // 显式实现非泛型接口{return GetEnumerator();}
}

2. 提供 GetEnumerator() 方法的公共非泛型实现

  • 如果类没有显式实现 IEnumerable,但提供了返回 IEnumerator 的公共方法,foreach 仍可工作:
public class MyCollection
{private int[] _data = { 1, 2, 3 };public IEnumerator GetEnumerator(){return _data.GetEnumerator();}
}

3. 使用 yield return 自动生成枚举器

  • 编译器会自动为包含 yield return 的方法生成 IEnumerable 实现:
public class MyCollection
{public IEnumerable<int> GetItems(){yield return 1;yield return 2;}
}// 使用时:
foreach (var item in new MyCollection().GetItems()) { ... }

4. 数组或字符串(语言内置支持)

  • 数组和字符串即使未显式实现接口,也能直接用 foreach 遍历(编译器特殊处理):
int[] array = { 1, 2, 3 };
foreach (int num in array) { ... } // 合法string str = "hello";
foreach (char c in str) { ... }    // 合法

关键点总结

  • 必须:对象需提供 GetEnumerator() 方法(通过接口或显式实现)。
  • 推荐:优先使用泛型接口 IEnumerable 以获得类型安全和性能优势。
  • 例外:数组和字符串是语言内置的特殊类型。

示例:完整泛型实现

using System.Collections.Generic;public class MyList<T> : IEnumerable<T>
{private List<T> _items = new List<T>();public void Add(T item) => _items.Add(item);public IEnumerator<T> GetEnumerator() => _items.GetEnumerator();System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()=> GetEnumerator();
}// 使用:
var list = new MyList<int>();
list.Add(1);
list.Add(2);
foreach (var item in list) { ... } // 正常遍历

通过满足上述条件,任何自定义对象都可以使用 foreach 遍历。

在这里插入图片描述

http://www.xdnf.cn/news/7944.html

相关文章:

  • Python爬虫实战:获取小说网最新风云榜数据并分析,为创作者提供参考素材
  • QMK固件RGB矩阵照明功能详解 - 打造你的专属炫彩键盘
  • 人工智能范式:技术革命下的认知重构
  • 分类预测 | Matlab实现PSO-RF粒子群算法优化随机森林多特征分类预测
  • AI 与 IT 从业者:风暴之眼中的共存与进化
  • Python数据分析实战:Pandas高效处理Excel数据指南
  • 赋能智慧党建:远眺科技助力党校可视化系统高效落地
  • Elasticsearch知识点
  • 独占内存访问指令LDXR/STXR
  • Android本地语音识别引擎深度对比与集成指南:Vosk vs SherpaOnnx
  • 【Linux】第二十五章 运行容器
  • 基于大模型的全面惊厥性癫痫持续状态技术方案
  • 以太联Intellinet带您深度解析PoE交换机的上行链路端口(Uplink Ports)
  • Java 线程与守护线程深度解析:原理、应用与优雅停止实践
  • 【题解-洛谷】P6180 [USACO15DEC] Breed Counting S
  • 检索增强生成(RAG):大模型的‘外挂知识库
  • 2025.05.21华为暑期实习机考真题解析第二题
  • 精益制造数字化转型智能工厂三年规划建设方案
  • SQL 查询来查看 PostgreSQL的各连接数
  • Ubuntu 20.04卸载并重装 PostgreSQL
  • UML 活动图 (Activity Diagram) 使用案例
  • 【Java高阶面经:微服务篇】8.高可用全链路治理:第三方接口不稳定的全场景解决方案
  • LeetCode热题100:Java哈希表中等难度题目精解
  • 【AI论文】AdaCoT:基于强化学习的帕累托最优自适应思维链触发机制
  • MCP-1:MCP组件与工作流程
  • 在离线 OpenEuler-22.03 服务器上升级 OpenSSH 的完整指南
  • 2025.05.21华为暑期实习机考真题解析第三题
  • python代码绘制某只股票最近90天的K线图、均线、量能图
  • 关于 Web 漏洞原理与利用:4. 文件上传漏洞
  • MFC 捕捉桌面存成jpg案例代码