前言
前段时间有过foreach (var item in enunerator)的脑洞,但百度半天没有结果。去bing找竟然在第一页第三个就是: Using foreach with IEnumerator<T> / IAsyncEnumerator<T> in C# 9 - Meziantou’s blog。
原理
只要有一个GetEnumerator()方法,且这个方法返回的对象包含Current属性和返回bool的MoveNext()方法,就可以对它应用foreach。到了C# 9,放宽了查找GetEnumerator()方法的限制,用拓展方法也可以。因此,添加一个符合条件的GetEnumerator()拓展方法就可以对它应用foreach,GetAsyncEnunerator()同理。
例子
首先把语言标准调到C# 9,这步就不赘述了。
internal static class EnumeratorExtension
{
public IEnumerator GetEnumerator(this IEnumerator enumerator) => enumerator;
public IEnumerator<T> GetEnumerator(this IEnumerator<T> enumerator) => enumerator;
public IAsyncEnumerator<T> GetAsyncEnumerator(this IAsyncEnumerator<T> enumerator) => enumerator;
}
class Program
{
static async Task Main()
{
IAsyncEnumerator<int> enumerator = GetAsyncEnumerator();
await foreach (var item in enumerator)
{
Console.WriteLine(item);
}
IEnumerator<int> enumerator = Enumerable.Range(0, 10).GetEnumerator();
// C# 8不行
// C# 9配合上述拓展方法可以
foreach (var item in enumerator)
{
Console.WriteLine(item);
}
}
static async IAsyncEnumerator<int> GetAsyncEnumerator()
{
yield return 0;
await Task.Delay(1);
yield return 1;
}
}
引用
https://www.meziantou.net/using-foreach-with-ienumerator-t-iasyncenumerator-t-in-csharp-9.htm
本文介绍了C#9中foreach的新扩展,允许使用IEnumerator和IAsyncEnumerator,只需通过添加符合条件的GetEnumerator扩展方法。通过实例展示了如何在C#9中实现并利用这些特性。

1801

被折叠的 条评论
为什么被折叠?



