Как агрегировать результаты IAsyncEnumerable - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу спросить, существует ли план или существует метод для агрегирования прибыли (ей) 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, которая собирает результаты перечислимого. Я что-то пропустил, есть какой-то синтактический сахар c, о котором я не знаю?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Пакет System.Linq.Asyn c, разработанный командой ReactiveX , предоставляет операторов LINQ для IAsyncEnumerable, которые эквивалентны тем, которые предоставляет LINQ для IEnumerable.

Сюда входят общие операторы, такие как Select () , Где () , Take () et c , Aggregate реализовано AggregateAsyn c.

Перегрузки аналогичны Enumerable.Aggregate , что означает, что вы можете написать:

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

AggregateAsync назван так, потому что он потребляет все перечисляемое и дает один результат. Для работы нужен await звонок. Другие операторы, такие как Select, принимают IAsyncEnumerable и производят новый. Там нет необходимости ждать их.

Вы можете использовать это соглашение об именах, чтобы найти нужные вам операторы Linq.Asyn c на основе имени эквивалентного Enumerable оператора

2 голосов
/ 25 февраля 2020

Вы можете использовать метод AggregateAsync из пакета System.Linq.Asyn c:

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

Вывод:

Результат: Ложь

...