แปลง IAsyncEnumerable เป็น List


18

ดังนั้นใน C # 8 เราจึงได้เพิ่มIAsyncEnumerableส่วนต่อประสาน

หากเรามีสิ่งปกติIEnumerableเราสามารถสร้างListคอลเล็กชั่นอื่น ๆ ที่เราต้องการได้ ขอบคุณ Linq ที่นั่น

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

ตอนนี้ฉันต้องการแปลงIAsyncEnumerableเป็น a Listและแน่นอนแบบอะซิงโครนัส มีการใช้งาน Linq สำหรับกรณีนั้นหรือไม่? ถ้าไม่มีฉันจะแปลงเป็นตัวเองได้อย่างไร

คำตอบ:


26

แน่นอนว่า - คุณเพียงแค่ต้องมีToListAsync()วิธีการที่อยู่ในแพคเกจSystem.Linq.Async NuGet นี่คือตัวอย่างที่สมบูรณ์:

ไฟล์โครงการ:

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

รหัส:

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

ขอบคุณสำหรับสิ่งนั้นที่น่าสนใจที่ยังไม่ได้เป็นส่วนหนึ่งของ. Net Core 3.1 Framework
ยี่สิบ

4
@ Twenty: เป็นแพ็คเกจแยกต่างหากมันสามารถใช้งานได้ง่ายบนแพลตฟอร์มที่ยืดออกไป
Jon Skeet

@JonSkeet มันได้รับข้อผิดพลาดเมื่อใช้แพคเกจนี้และแกน Ado.Net
ca9163d9

@ ca9163d9: "ได้รับข้อผิดพลาด" ไม่ได้ให้ข้อมูลมากนัก ผมขอแนะนำให้คุณถามคำถามใหม่ที่มีความสมบูรณ์เช่นทำซ้ำน้อยที่สุด
Jon Skeet

@ JonSkeet ทำซ้ำได้ทันที มันล้มเหลวawait iOrderedQueryable.ToListAsync(cancellationToken)หลังจากเพิ่มแพ็กเกจ nuget ข้อผิดพลาดจะหายไปหลังจากฉันลบแพ็กเกจ nuget
ca9163d9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.