C#中IEnumerable 、IAsyncEnumerable、yield
C#中IEnumerable 、IAsyncEnumerable、yield
-
- 概念总览
- 1. IEnumerable 接口
-
- 基本概念
- 示例:自定义集合
- 2. yield 关键字和懒加载
-
- yield 工作原理
- 实际应用:分页数据加载
- 3. 协程(Coroutine)概念
- 4. IAsyncEnumerable<T> 和 await foreach
-
- 异步迭代接口
- 示例:异步数据流
- 5. 实际开发应用场景
-
- 场景1:数据库大数据集处理
- 场景2:实时数据流处理
- 场景3:Web API 分块响应
- 6. 性能对比和最佳实践
-
- 内存使用对比
- 最佳实践
- 总结
概念总览
概念 | 描述 | 引入版本 |
---|---|---|
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; // 每次迭代返回一个值}}
}// 使用 - 延迟执行