Convertir IAsyncEnumerable en liste

18

Donc, en C # 8, nous avons obtenu l'ajout de l' IAsyncEnumerableinterface.

Si nous avons une normale, IEnumerablenous pouvons en faire une Listou presque toute autre collection que nous voulons. Merci à Linq là-bas.

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

Eh bien maintenant, je veux convertir mon IAsyncEnumerableen un Listet cela bien sûr de manière asynchrone. Existe-t-il déjà des implémentations Linq pour ce cas? S'il n'y en a pas, comment pourrais-je le convertir moi-même alors?

Vingt
la source

Réponses:

26

Bien sûr - vous avez juste besoin de la ToListAsync()méthode, qui se trouve dans le System.Linq.Asyncpackage NuGet . Voici un exemple complet:

Fichier de projet:

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

Code:

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
la source
Merci pour celui-ci, intéressant qu'il ne fasse pas encore partie du Framework .Net Core 3.1.
20
4
@Twenty: En tant que package séparé, il est facilement utilisable sur des plates-formes qui remontent.
Jon Skeet
@JonSkeet Il obtient l'erreur lors de l'utilisation de ce package et du noyau Ado.Net.
ca9163d9
@ ca9163d9: "Il obtient l'erreur" ne fournit pas vraiment beaucoup d'informations. Je vous suggère de poser une nouvelle question avec un exemple reproductible minimal complet .
Jon Skeet
@JonSkeet, l'a reproduit tout à l'heure. Il a échoué await iOrderedQueryable.ToListAsync(cancellationToken)après avoir ajouté le package nuget. L'erreur a disparu après avoir supprimé le package nuget.
ca9163d9