我想问一下,是否有一个计划或存在一个聚合IAsyncEnumerable返回的方法?那么,鉴于下面的方法,为什么没有简单的方法来聚合其结果呢?
public async IAsyncEnumerable<bool> GenerateAsyncEnumerable(int range)
{
foreach (var x in Enumerable.Range(0, range))
{
await Task.Delay(500 * x);
yield return x % 2 == 0;
}
}当前场景
public async Task Main()
{
bool accum = true;
await foreach (var item in GenerateAsyncEnumerable(3))
{
accum &= item;
//have some side effects on each particular item of the sequence
}
Console.WriteLine($"Accumulator:{accum}");
}所需的场景
我想聚合给定自定义聚合IAsyncEnumerable的Func的结果
public async Main()
{
bool result = await foreach (var item in GenerateAsyncEnumerable(3).Aggregate(true, (x, y) => x & y))
{
//have some side effects on each particular item of the sequence
}
}P.S我不喜欢(在第一个场景中),我不得不添加一个额外的局部变量accum来收集可枚举的结果。我是不是漏掉了什么,有没有我不知道的语法糖?
发布于 2020-02-25 12:58:07
您可以从AggregateAsync包中使用System.Linq.Async方法:
bool result = await GenerateAsyncEnumerable(3).AggregateAsync(true, (x, y) => x & y);
Console.WriteLine($"Result: {result}");输出:
结果:假
发布于 2020-02-25 13:07:00
由System.Linq.Async团队开发的ReactiveX包为IAsyncEnumerable提供了相当于LINQ为IEnumerable提供的LINQ算子。
其中包括选择()、其中()、采取()等常用操作符。Aggregate由AggregateAsync实现。
重载类似于Enumerable.Aggregate,这意味着您可以编写:
bool result=await GenerateAsyncEnumerable(3).AggregateAsync(true, (x, y) => x & y);AggregateAsync是这样命名的,因为它消耗了整个枚举并产生一个结果。它需要一个await调用才能工作。不过,像Select这样的其他操作符,接受一个IAsyncEnumerable并生产一个新的。没必要等他们。
可以使用此命名约定根据等效的Linq.Async运算符的名称查找所需的Enumerable运算符。
https://stackoverflow.com/questions/60392622
复制相似问题