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

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.dtcms.com/a/204504.html

相关文章:

  • Unity3D序列化机制详解
  • CMMI(能力成熟度模型集成)详解及5个级别案例
  • 平衡二叉树的判定:回溯法的深度解析与迭代法拓展
  • 台风灾害下考虑调节特性的多元资源紧急协调调度
  • vue3:十三、分类管理-表格--模糊查询搜索框
  • 腾讯位置服务重构出行行业的技术底层逻辑
  • Java SE 抽象类和接口(下)
  • 【题解-洛谷】B4240 [海淀区小学组 2025] 最短字符串
  • NIFI的处理器:ExecuteGroovyScript 2.4.0
  • C# AI(Trae工具+claude3.5-sonnet) 写前后端
  • A1-A2 英语学习系列 第五集
  • Java枚举详解
  • 抽象:C++命名作用域与函数调用
  • IO pin的transition约束从哪来?
  • 高级认知型Agent
  • dedecms织梦全局变量调用方法总结
  • 如何在电脑上登录多个抖音账号?多开不同IP技巧分解
  • 广东省省考备考(第十六天5.21)—言语:语句排序题(听课后强化)
  • React中 lazy与 Suspense懒加载的组件
  • git合并多次commit提交
  • CentOS:搭建国内软件repository,以实现自动yum网络安装
  • JUC高并发编程
  • 自动化软件如何确保高可用性和容错性?
  • 云蝠智能大模型呼叫动态情感共情能力上线!
  • 大语言模型 17 - MCP Model Context Protocol 介绍对比分析 基本环境配置
  • 双活数据中心解决方案
  • 如何在Java中处理PDF文档(教程)
  • :-1: error: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set错误原因及解决方法
  • WSD3043 MOSFET 在吸黑头仪中的应用
  • #Redis缓存篇#(七)分布式缓存