Konwertuj IAsyncEnumerable na List

18

Więc w C # 8 dodaliśmy IAsyncEnumerableinterfejs.

Jeśli mamy coś normalnego IEnumerable, możemy z niego zrobić Listdowolną inną kolekcję. Dzięki Linq tam.

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

Cóż, teraz chcę przekonwertować moje IAsyncEnumerablena Listi to oczywiście asynchronicznie. Czy istnieją już implementacje Linq dla tego przypadku? Jeśli nie, to jak mógłbym to przekonwertować?

20
źródło

Odpowiedzi:

26

Jasne - potrzebujesz tylko ToListAsync()metody System.Linq.Asynczawartej w pakiecie NuGet . Oto kompletny przykład:

Plik projektu:

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

Kod:

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
źródło
Dzięki za ten interesujący, że nie jest jeszcze częścią .Net Core 3.1 Framework.
20
4
@Twenty: Jako osobny pakiet, można go łatwo używać na platformach rozciągających się daleko.
Jon Skeet,
@JonSkeet Podczas używania tego pakietu i rdzenia Ado.Net pojawia się błąd.
ca9163d9
@ ca9163d9: „Wystąpił błąd”, tak naprawdę nie dostarcza wielu informacji. Proponuję zadać nowe pytanie z kompletnym minimalnym, powtarzalnym przykładem .
Jon Skeet
@JonSkeet, właśnie to odtworzyłem. Nie powiodło się await iOrderedQueryable.ToListAsync(cancellationToken)po dodaniu pakietu nuget. Błąd zniknął po usunięciu pakietu nuget.
ca9163d9