C#中IEnumerable 、IAsyncEnumerable、yield
概念总览
概念 | 描述 | 引入版本 |
---|---|---|
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; // 每次迭代返回一个值
}
}
}
// 使用 - 延迟执行