【C#】IEnumerable

IEnumerable

IEnumerable是C#中集合操作的核心接口之一,全程Interface Enumerable,表示可被枚举的集合的接口,定义了一个最简单的能力:可以用foreach来逐个访问元素。

用途

  1. foreach遍历 :只要对象可以被枚举,就可以用foreach遍历(数组、列表、字典、数据库结果集等)。
  2. LINQ查询 :LINQ依赖于IEnumerable<T>,查询是延迟执行的,只有foreach遍历时才会真正计算结果。
  3. 用于惰性(延迟)加载/流式数据yield return。一般用于读取大文件逐行处理、数据库分页查询、网络流式传输、避免一次性加载全部数据进入内存等情况。
  4. 用于返回可枚举结果而不是具体的集合

如果希望立刻执行查询不延迟,或者想缓存结果防止多次计算的话,需要调用ToList() / ToArray()转为具体的集合

使用场景

使用场景 是否适合用 IEnumerable 原因
遍历集合 foreach 基于它
惰性执行(LINQ) Where/Select/Take 等都返回它
返回数据序列(流式) 可一边生成一边使用
小集合、需随机访问 List 更方便
频繁访问、修改 IEnumerable只读、单向

IEnumerableIEnumerator

  • IEnumerable只提供一个方法IEnumerator GetEnumerator(),是集合的外壳,用来创建迭代器
  • IEnumerator是枚举器,用来逐个获取元素,是迭代的工具,用来控制如何遍历
csharp 复制代码
public interface IEnumerable
{
    IEnumerator GetEnumerator(); // 提供"迭代器"
}

// 泛型版本
public interface IEnumerable<T> : IEnumerable
{
    IEnumerator<T> GetEnumerator();
}

public interface IEnumerator
{
    bool MoveNext();    // 翻到下一项
    object Current { get; } // 当前项
    void Reset();       // 回到起点(一般不用)
}

因手写 IEnumerator 太繁琐,C# 提供了语法糖,这个语法糖会让编译器自动生成 IEnumerator 实现。

csharp 复制代码
public IEnumerable<int> MyRange(int start, int count)
{
    for (int i = start; i < start + count; i++)
    {
        yield return i; // 自动生成 Enumerator
    }
}

总结

特性 说明
接口定义 IEnumerable<T>是一个能被遍历的集合接口
核心方法 GetEnumerator()
常见来源 ListArray、LINQ 查询、yield 方法
是否延迟执行 取决于实现(List否,LINQ 查询 是)
优点 通用、节省内存、可惰性执行、可扩展
缺点 不支持随机访问、只读、无法修改集合内容
相关推荐
hez20106 小时前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉6 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫7 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫8 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6258 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902118 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠8 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫10 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech11 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf12 天前
C#摸鱼实录——IoC与DI案例详解
c#