2

我想问是否有计划或存在一种方法来汇总一个或多个收益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
    }
}

PS我不喜欢(在第一种情况下)我必须添加一个额外的局部变量accum来收集可枚举的结果。我错过了什么吗,是否有一些我不知道的语法糖?

4

2 回答 2

4

您可以使用System.Linq.Async包中的AggregateAsync方法:

bool result = await GenerateAsyncEnumerable(3).AggregateAsync(true, (x, y) => x & y);
Console.WriteLine($"Result: {result}");

输出:

结果:错误

于 2020-02-25T12:58:07.170 回答
2

ReactiveX团队开发的System.Linq.Async包提供的LINQ 运算符与LINQ 提供的.IAsyncEnumerableIEnumerable

这包括常见的运算符,如Select()Where()Take()Aggregate,由AggregateAsync实现。

重载类似于Enumerable.Aggregate ,这意味着您可以编写:

bool result=await GenerateAsyncEnumerable(3).AggregateAsync(true, (x, y) => x & y);

AggregateAsync以这种方式命名是因为它消耗整个可枚举并产生单个结果。它需要一个await电话才能工作。不过,其他运营商喜欢Select接受一个IAsyncEnumerable并生产一个新的。没有必要等待他们。

您可以使用此命名约定根据等效运算符的名称查找所需的 Linq.Async 运算Enumerable

于 2020-02-25T13:07:00.383 回答