Converti IAsyncEnumerable in List


18

Quindi in C # 8 abbiamo ottenuto l'aggiunta IAsyncEnumerabledell'interfaccia.

Se abbiamo un normale IEnumerablepossiamo fare una Listo più qualsiasi altra collezione che vogliamo da essa. Grazie a Linq lì.

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

Bene, ora voglio convertire il mio IAsyncEnumerablein un Liste questo ovviamente in modo asincrono. Esistono già implementazioni Linq per quel caso? In caso contrario, come potrei convertirlo da solo?

Risposte:


26

Certo, hai solo bisogno del ToListAsync()metodo, che si trova nel System.Linq.Asyncpacchetto NuGet . Ecco un esempio completo:

File di progetto:

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

Codice:

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

Grazie per quello, interessante che non fa ancora parte del .Net Core 3.1 Framework.
Venti

4
@Twenty: come pacchetto separato, è facilmente utilizzabile su piattaforme che si estendono molto indietro.
Jon Skeet il

@JonSkeet Ottiene l'errore quando si utilizza questo pacchetto e il core Ado.Net.
ca9163d9,

@ ca9163d9: "Ottiene l'errore" in realtà non fornisce molte informazioni. Ti suggerisco di porre una nuova domanda con un esempio riproducibile minimo completo .
Jon Skeet,

@JonSkeet, l'ho riprodotto proprio ora. Non è riuscito await iOrderedQueryable.ToListAsync(cancellationToken)dopo aver aggiunto il pacchetto nuget. L'errore è scomparso dopo aver rimosso il pacchetto nuget.
ca9163d9,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.