Преобразовать IAsyncEnumerable в Список

18

Итак, в C # 8 мы получили дополнение IAsyncEnumerableинтерфейса.

Если у нас есть нормальный, IEnumerableмы можем сделать из него Listили почти любую другую коллекцию, которую мы хотим. Благодаря Linq там.

var range = Enumerable.Range(0, 100);
var list = range.ToList();

Ну, теперь я хочу преобразовать мой IAsyncEnumerableв Listи это, конечно, асинхронно. Уже есть реализации Linq для этого случая? Если нет, как я могу преобразовать это сам тогда?

Двадцать
источник

Ответы:

26

Конечно - вам просто нужен ToListAsync()метод, который находится в System.Linq.Asyncпакете NuGet . Вот полный пример:

Файл проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.Linq.Async" Version="4.0.0" />
  </ItemGroup>

</Project>

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        IAsyncEnumerable<string> sequence = GetStringsAsync();
        List<string> list = await sequence.ToListAsync();
        Console.WriteLine(list.Count);
    }

    static async IAsyncEnumerable<string> GetStringsAsync()
    {
        yield return "first";
        await Task.Delay(1000);
        yield return "second";
        await Task.Delay(1000);
        yield return "third";
    }
}
Джон Скит
источник
Спасибо за это, интересно, что он еще не является частью .Net Core 3.1 Framework.
Двадцать
4
@Twenty: как отдельный пакет, его легко использовать на платформах, уходящих далеко назад.
Джон Скит
@JonSkeet Получает ошибку при использовании этого пакета и ядра Ado.Net.
ca9163d9
@ ca9163d9: «Он получает ошибку» на самом деле не дает много информации. Я предлагаю вам задать новый вопрос с полным минимальным воспроизводимым примером .
Джон Скит
@JonSkeet, воспроизвел это только сейчас. Не удалось await iOrderedQueryable.ToListAsync(cancellationToken)после добавления пакета nuget. Ошибка исчезла после того, как я удалил пакет nuget.
ca9163d9