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?

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.