C#中IEnumerable 、IAsyncEnumerable、yield

发布于:2025-09-07 ⋅ 阅读:(20) ⋅ 点赞:(0)

概念总览

概念 描述 引入版本
IEnumerable 支持迭代的接口,定义GetEnumerator方法 .NET 2.0
yield 实现迭代器块的关键字,支持延迟执行 .NET 2.0
懒加载 延迟计算或加载数据,只在需要时执行 -
协程 能暂停和恢复执行的函数,yield return实现 .NET 2.0
IAsyncEnumerable<T> 支持异步迭代的接口 C# 8.0
await foreach 异步迭代语法,用于遍历异步序列 C# 8.0

1. IEnumerable 接口

基本概念

IEnumerable 是.NET中所有集合的基础接口,它定义了迭代的能力。

public interface IEnumerable<out T> : IEnumerable
{
   
   
    IEnumerator<T> GetEnumerator();
}

public interface IEnumerator<out T> : IDisposable, IEnumerator
{
   
   
    T Current {
   
    get; }
}

示例:自定义集合

public class NumberSequence : IEnumerable<int>
{
   
   
    private readonly int _start;
    private readonly int _count;

    public NumberSequence(int start, int count)
    {
   
   
        _start = start;
        _count = count;
    }

    public IEnumerator<int> GetEnumerator()
    {
   
   
        for (int i = 0; i < _count; i++)
        {
   
   
            yield return _start + i;
        }
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

// 使用
var numbers = new NumberSequence(10, 5);
foreach (var num in numbers)
{
   
   
    Console.WriteLine(num); // 输出: 10, 11, 12, 13, 14
}

2. yield 关键字和懒加载

yield 工作原理

yield 关键字将方法转换为状态机,实现延迟执行。

public static IEnumerable<int> GetEvenNumbers(int max)
{
   
   
    for (int i = 0; i <= max; i++)
    {
   
   
        if (i % 2 == 0)
        {
   
   
            yield return i; // 每次迭代返回一个值
        }
    }
}

// 使用 - 延迟执行

网站公告

今日签到

点亮在社区的每一天
去签到