Konvertieren Sie IAsyncEnumerable in List

18

In C # 8 wurde die IAsyncEnumerableSchnittstelle hinzugefügt.

Wenn wir eine normale IEnumerablehaben, können wir daraus eine Listoder so ziemlich jede andere Sammlung machen, die wir wollen. Danke an Linq da.

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

Nun möchte ich meine IAsyncEnumerablein eine konvertieren Listund dies natürlich asynchron. Gibt es für diesen Fall bereits Linq-Implementierungen? Wenn nicht, wie könnte ich es dann selbst konvertieren?

Zwanzig
quelle

Antworten:

26

Sicher - Sie brauchen nur die ToListAsync()Methode, die im System.Linq.AsyncNuGet-Paket enthalten ist . Hier ist ein vollständiges Beispiel:

Projektdatei:

<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
quelle
Vielen Dank dafür, interessant, dass es noch nicht Teil des .Net Core 3.1 Frameworks ist.
Zwanzig
4
@Twenty: Als separates Paket kann es problemlos auf Plattformen verwendet werden, die sich weit zurück erstrecken.
Jon Skeet
@ JonSkeet Bei Verwendung dieses Pakets und des Ado.Net-Kerns wird der Fehler angezeigt.
ca9163d9
@ ca9163d9: "Es wird der Fehler angezeigt" liefert nicht wirklich viele Informationen. Ich schlage vor, Sie stellen eine neue Frage mit einem vollständig minimal reproduzierbaren Beispiel .
Jon Skeet
@ JonSkeet, reproduzierte es gerade jetzt. Es ist fehlgeschlagen, await iOrderedQueryable.ToListAsync(cancellationToken)nachdem das Nuget-Paket hinzugefügt wurde. Der Fehler ist verschwunden, nachdem ich das Nuget-Paket entfernt habe.
ca9163d9