C# yeild 语法糖

文章介绍了迭代器作为遍历集合的机制,特别是对于无限序列或高成本操作的场景,如生成质数。通过示例展示了如何使用迭代器实现惰性计算,一次只处理一个元素,以及如何通过IAsyncEnumerable实现异步迭代,允许在处理每个元素时引入延迟,如模拟清洁鱼的2秒过程。
摘要由CSDN通过智能技术生成

迭代器不只是一种遍历集合的方式(这只是最简单的用例之一),相反迭代器是返回序列的一种方式。这个序列甚至可能是无限的,或者单次的operation的cost很巨大比如load item,process。比如返回质数的list,我们没有办法返回一个无限长度的列表并使用前100个项。所以有时它必须是惰性的,每次执行完之后交还给caller。返回一个集合与返回一个即迭代是完全不同的概念。

看个例子: 

var Fishes = ProduceFish(5);
Console.WriteLine("Cheif: start to cook.");
Console.WriteLine("**********************");
foreach (int i in Fishes)
{
    Console.WriteLine($"Cook the Fish: {i}");
}

IEnumerable<int> ProduceFish(int upto)
{
    Console.WriteLine("Helper helps to clean the fish ");
    for (int i = 0; i <= upto; i += 1)
    {
        Console.WriteLine("**********************");
        Console.WriteLine($"Helper cleans fish {i}");
        yield return i;
        Console.WriteLine($"Cook fish {i} finished, Helper move to next fish");
    }
    Console.WriteLine("End of Bussiness, Helper starts to clean the kitchen");
}

输出: 

 可以看到Helper每次只处理一条鱼,就会交给Cheif进行处理,而不是把5条鱼都处理完了之后,一块返回做处理。 

我们可以给每条鱼的处理加上2s的处理时间,使用 IAsyncEnumerable<T>替换掉 IEnumerable<T>来获得异步的iterator: 

var Fishes = ProduceFish(5);
Console.WriteLine("Cheif: start to cook.");
Console.WriteLine("**********************");
await foreach (int i in Fishes)
{
    Console.WriteLine($"Cook the Fish: {i}");
}

async IAsyncEnumerable<int> ProduceFish(int upto)
{
    Console.WriteLine("Helper helps to clean the fish ");
    for (int i = 0; i <= upto; i += 1)
    {
        Console.WriteLine("**********************");
        Console.WriteLine($"Helper cleans fish {i}");
        yield return await TakeTimeToCleanFish(i);
        Console.WriteLine($"Cook fish {i} finished, Helper move to next fish");
    }
    Console.WriteLine("End of Bussiness, Helper starts to clean the kitchen");
}

async Task<int> TakeTimeToCleanFish(int i)
{
    await Task.Delay(2000);
    Console.WriteLine($"It took 2s to clean the fish {i}");
    return i; 
}

每次处理过程会以2s为间隔输出: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值