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?

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";
    }
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.