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?

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.