Converter IAsyncEnumerable em lista

18

Então, no C # 8, obtivemos a adição da IAsyncEnumerableinterface.

Se tivermos um normal IEnumerable, podemos fazer uma Listou quase qualquer outra coleção que desejemos dela. Graças a Linq lá.

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

Bem, agora eu quero converter meu IAsyncEnumerablepara Listae, é claro, de forma assíncrona. Já existem implementações do Linq para esse caso? Se não houver, como eu mesmo poderia convertê-lo?

Vinte
fonte

Respostas:

26

Claro - você só precisa do ToListAsync()método, que está no System.Linq.Asyncpacote NuGet . Aqui está um exemplo completo:

Arquivo do projeto:

<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>

Código:

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";
    }
}
Jon Skeet
fonte
Obrigado por isso, interessante que ainda não faz parte do .Net Core 3.1 Framework.
20
4
@ Twenty: Como um pacote separado, é facilmente utilizável em plataformas que remontam ao passado.
Jon Skeet
@ JonSkeet Ele recebe o erro ao usar este pacote e o núcleo do Ado.Net.
ca9163d9 12/02
@ ca9163d9: "Recebe o erro" realmente não fornece muita informação. Eu sugiro que você faça uma nova pergunta com um exemplo reprodutível mínimo completo .
Jon Skeet
@ JonSkeet, reproduzi-o agora. Falha await iOrderedQueryable.ToListAsync(cancellationToken)após adicionar o pacote nuget. O erro desapareceu depois que eu removi o pacote nuget.
ca9163d9 11/04