- concat函数在js中的使用
- List中contains方法和indexOf方法的区别
- 百度百科SEO研究
- C#中List集合使用LastOrDefault方法查找出最后一个符合条件的元素
- 如果composer速度慢,可以composer更换国内镜像
- 微信小程序 wx:for、wx:for-items和wx:for-item的正确用法
- MVC和三层架构的区别
- C# MVC过滤器
- O2O、C2C、B2B、B2C的区别
- 微商怎么做,微商怎么找客源!
邮箱:
手机:15383239821
C#中IEnumerable接口的使用
在 C# 中,IEnumerable<T>(读作 “I Enumerable”)是 .NET 中表示“可枚举集合”的核心接口。它是 LINQ、foreach 循环以及几乎所有集合类型(如 List<T>、数组、Dictionary<TKey, TValue> 等)的基础。
IEnumerable<T> 的唯一职责就是:提供一种方式,让你能逐个访问集合中的元素,而不需要知道集合内部是怎么存储数据的。
这体现了面向对象中的 “抽象” 和 “解耦” 思想。
接口定义,简化版
public interface IEnumerable<out T> {
IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IDisposable {
T Current { get; } // 当前元素
bool MoveNext(); // 移动到下一个元素,返回是否还有
void Reset(); // 重置(很少用)
}
最常见的使用场景
1.支持foreach循环
任何实现 IEnumerable<T> 的类型都可以被 foreach 遍历:
List<int> numbers = new List<int> { 1, 2, 3 };
// foreach 底层调用 numbers.GetEnumerator()
foreach (int n in numbers)
{
Console.WriteLine(n);
}
2.作为方法返回类型(推荐!)
当你写一个返回“一组数据”的方法时,优先返回 IEnumerable<T> 而不是 List<T> 或数组:
public IEnumerable<string> GetActiveUsers()
{
yield return "Alice";
yield return "Bob";
// 或 return dbContext.Users.Where(u => u.IsActive).Select(u => u.Name);
}
好处:
延迟执行(Lazy Evaluation):调用方法时不会立即计算所有结果,而是在遍历时逐个生成。
解耦:调用方不关心你是用 List、数组还是数据库查出来的。
节省内存:尤其适合大数据流或无限序列。
3.LINQ 查询的基础
所有 LINQ 方法(如 Where, Select, OrderBy)的输入和输出都是 IEnumerable<T>:
var result = numbers
.Where(x => x > 0) // 返回 IEnumerable<int>
.Select(x => x * 2); // 返回 IEnumerable<int>
IEnumerable<T>vsList<T>vs 数组

黄金建议:
参数类型:如果只需要遍历,用 IEnumerable<T>
返回类型:优先返回 IEnumerable<T>(除非调用方明确需要 List)
局部变量:如果需要修改或索引,用 List<T>
自定义IEnumerable<T>示例(了解即可)
public class Countdown : IEnumerable<int>
{
private int _start;
public Countdown(int start) => _start = start;
public IEnumerator<int> GetEnumerator()
{
for (int i = _start; i >= 0; i--)
yield return i; // yield 自动实现 IEnumerator
}
// 非泛型版本(为了兼容旧代码)
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
// 使用
foreach (int n in new Countdown(3))
{
Console.WriteLine(n); // 输出: 3, 2, 1, 0
}
实际开发中,99% 的情况你不需要手动实现 IEnumerable<T>,因为 List<T>、数组等已经实现了它。
常见误区
❌ 误区1:IEnumerable<T>是一个集合类
✅ 正解:它只是一个接口,描述“可以被遍历”,本身不存储数据。
❌ 误区2:多次遍历IEnumerable<T>总是安全的
✅ 正解:有些 IEnumerable<T> 只能遍历一次(比如从数据库流式读取的结果)。
如果需要多次遍历,调用 .ToList() 缓存结果:
var query = dbContext.Users.Where(u => u.Age > 18); // IQueryable<T> : IEnumerable<T>
// 第一次遍历:OK
foreach (var u in query) { ... }
// 第二次遍历:可能报错(数据库连接已关闭)
foreach (var u in query) { ... } // ❌ 危险!
// 安全做法:
var users = query.ToList(); // 立即执行并缓存
小结
关键点 说明
是什么 表示“可被遍历”的接口
核心方法 GetEnumerator() → 返回一个“迭代器”
最大优势 抽象遍历逻辑,支持 foreach 和 LINQ
最佳实践 方法返回类型优先用 IEnumerable<T>
注意陷阱 警惕一次性枚举器,必要时 .ToList()
一句话记住:“IEnumerable<T> = 能被 foreach 的东西。”
如果你正在写一个返回列表的方法,不妨试试返回 IEnumerable<T>,你会发现代码更灵活、更符合 .NET 设计哲学 😊
需要我帮你分析某个具体场景该用 IEnumerable<T> 还是 List<T> 吗?
什么是枚举器?
枚举其是一种允许遍历集合元素的机制,他是一种指向集合中当前元素的指针。
假设一个方法返回某种类型的集合,如果你不希望用户修改此集合,如何最好地表达你的意图?
可以将其作为Ienumerable或其他只读集合类型返回。
-
2012-11-12企业建设网站不应该一味追求网站制作价格
-
2010-10-18解决了一个小问题,希望对大家有帮助
-
2012-07-02三大seo外链工具比较
-
2025-11-13string.format()用法
-
2014-02-24HTML 事件属性
-
2011-03-29Web.config配置文件详解
