【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 查询 是)
优点 通用、节省内存、可惰性执行、可扩展
缺点 不支持随机访问、只读、无法修改集合内容
相关推荐
Scout-leaf3 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
用户298698530143 天前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版
后端·c#·.net
mudtools4 天前
搭建一套.net下能落地的飞书考勤系统
后端·c#·.net
玩泥巴的5 天前
搭建一套.net下能落地的飞书考勤系统
c#·.net·二次开发·飞书
唐宋元明清21885 天前
.NET 本地Db数据库-技术方案选型
windows·c#
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
lindexi5 天前
dotnet DirectX 通过可等待交换链降低输入渲染延迟
c#·directx·d2d·direct2d·vortice
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言