C# 9 对IEnumerator类似物应用foreach

本文介绍了C#9中foreach的新扩展,允许使用IEnumerator和IAsyncEnumerator,只需通过添加符合条件的GetEnumerator扩展方法。通过实例展示了如何在C#9中实现并利用这些特性。

前言

前段时间有过foreach (var item in enunerator)的脑洞,但百度半天没有结果。去bing找竟然在第一页第三个就是: Using foreach with IEnumerator<T> / IAsyncEnumerator<T> in C# 9 - Meziantou’s blog

原理

只要有一个GetEnumerator()方法,且这个方法返回的对象包含Current属性和返回boolMoveNext()方法,就可以对它应用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值