Konversi IAsyncEnumerable ke Daftar

18

Jadi di C # 8 kami mendapat tambahan IAsyncEnumerableantarmuka.

Jika kita memiliki normal, IEnumerablekita dapat membuat Listatau cukup banyak koleksi lain yang kita inginkan. Terima kasih untuk Linq di sana.

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

Nah sekarang saya ingin mengonversikan saya IAsyncEnumerableke Listdan ini tentu saja tidak sinkron. Apakah sudah ada implementasi Linq untuk kasus itu? Jika tidak, bagaimana saya bisa mengubahnya sendiri?

Dua puluh
sumber

Jawaban:

26

Tentu - Anda hanya perlu ToListAsync()metodenya, yang ada di System.Linq.Asyncpaket NuGet . Ini contoh lengkapnya:

File proyek:

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

Kode:

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
sumber
Terima kasih untuk yang satu itu, menarik bahwa ini belum menjadi bagian dari .Net Core 3.1 Framework.
Dua puluh
4
@ Dua Puluh: Sebagai paket terpisah, ini dapat digunakan dengan mudah pada platform yang membentang jauh ke belakang.
Jon Skeet
@JonSkeet Terjadi kesalahan saat menggunakan paket ini dan inti Ado.Net.
ca9163d9
@ ca9163d9: "It got the error" tidak benar-benar memberikan banyak informasi. Saya sarankan Anda mengajukan pertanyaan baru dengan contoh lengkap minimal yang dapat direproduksi .
Jon Skeet
@ JonSkeet, direproduksi barusan. Gagal await iOrderedQueryable.ToListAsync(cancellationToken)setelah menambahkan paket nuget. Kesalahan hilang setelah saya menghapus paket nuget.
ca9163d9