如何聚合 IAsyncEnumerable 的结果
How to aggregate results of an IAsyncEnumerable
我想问一下是否有计划或存在一种方法来聚合 IAsyncEnumerable
的 return(s)?那么对于下面的方法,为什么没有简洁的方法来聚合其结果?
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}");
}
期望的场景
我想在给定自定义聚合 Func
的情况下聚合 IAsyncEnumerable
的结果
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
来收集可数的。我是否遗漏了什么,是否有一些我不知道的语法糖?
您可以使用 AggregateAsync
方法,来自 System.Linq.Async 包:
bool result = await GenerateAsyncEnumerable(3).AggregateAsync(true, (x, y) => x & y);
Console.WriteLine($"Result: {result}");
输出:
Result: False
IAsyncEnumerable
的 System.Linq.Async package developed by the ReactiveX team provides LINQ operators 相当于 LINQ 为 IEnumerable
提供的 System.Linq.Async package developed by the ReactiveX team provides LINQ operators。
这包括常见的运算符,如 Select(), Where(), Take() etc. Aggregate
is implemented by AggregateAsync。
重载类似于Enumerable.Aggregate
,这意味着你可以写:
bool result=await GenerateAsyncEnumerable(3).AggregateAsync(true, (x, y) => x & y);
AggregateAsync
之所以这样命名,是因为它消耗了整个可枚举并产生了一个结果。它需要一个 await
调用才能工作。不过,其他运算符如 Select
会接受一个 IAsyncEnumerable
并生成一个新的。没必要等他们。
您可以使用此命名约定根据等效 Enumerable
运算符
的名称查找您需要的 Linq.Async 运算符
我想问一下是否有计划或存在一种方法来聚合 IAsyncEnumerable
的 return(s)?那么对于下面的方法,为什么没有简洁的方法来聚合其结果?
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}");
}
期望的场景
我想在给定自定义聚合 Func
IAsyncEnumerable
的结果
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
来收集可数的。我是否遗漏了什么,是否有一些我不知道的语法糖?
您可以使用 AggregateAsync
方法,来自 System.Linq.Async 包:
bool result = await GenerateAsyncEnumerable(3).AggregateAsync(true, (x, y) => x & y);
Console.WriteLine($"Result: {result}");
输出:
Result: False
IAsyncEnumerable
的 System.Linq.Async package developed by the ReactiveX team provides LINQ operators 相当于 LINQ 为 IEnumerable
提供的 System.Linq.Async package developed by the ReactiveX team provides LINQ operators。
这包括常见的运算符,如 Select(), Where(), Take() etc. Aggregate
is implemented by AggregateAsync。
重载类似于Enumerable.Aggregate ,这意味着你可以写:
bool result=await GenerateAsyncEnumerable(3).AggregateAsync(true, (x, y) => x & y);
AggregateAsync
之所以这样命名,是因为它消耗了整个可枚举并产生了一个结果。它需要一个 await
调用才能工作。不过,其他运算符如 Select
会接受一个 IAsyncEnumerable
并生成一个新的。没必要等他们。
您可以使用此命名约定根据等效 Enumerable
运算符