Convertir IAsyncEnumerable a List

18

Entonces, en C # 8 obtuvimos la adición de la IAsyncEnumerableinterfaz.

Si tenemos una normal IEnumerable, podemos hacer una Listo casi cualquier otra colección que queramos. Gracias a Linq allí.

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

Bueno, ahora quiero convertir mi IAsyncEnumerablea Listay esto, por supuesto, de forma asincrónica. ¿Ya hay implementaciones de Linq para ese caso? Si no lo hay, ¿cómo podría convertirlo yo mismo?

Veinte
fuente

Respuestas:

26

Claro, solo necesita el ToListAsync()método, que está en el System.Linq.Asyncpaquete NuGet . Aquí hay un ejemplo completo:

Archivo de proyecto:

<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
fuente
Gracias por eso, es interesante que todavía no forme parte de .Net Core 3.1 Framework.
Veinte
44
@Twenty: como paquete separado, es fácilmente utilizable en plataformas que se extienden desde hace mucho tiempo.
Jon Skeet
@ JonSkeet Obtiene el error cuando usa este paquete y el núcleo de Ado.Net.
ca9163d9
@ ca9163d9: "Obtiene el error" en realidad no proporciona mucha información. Le sugiero que haga una nueva pregunta con un ejemplo completo mínimo reproducible .
Jon Skeet
@ JonSkeet, lo reproduje hace un momento. Falló await iOrderedQueryable.ToListAsync(cancellationToken)después de agregar el paquete nuget. El error desapareció después de que eliminé el paquete nuget.
ca9163d9