Chuyển đổi IAsyncEnumerable thành Danh sách


18

Vì vậy, trong C # 8, chúng tôi đã bổ sung IAsyncEnumerablegiao diện.

Nếu chúng ta có một bình thường, IEnumerablechúng ta có thể tạo ra một Listhoặc nhiều bộ sưu tập khác mà chúng ta muốn từ nó. Cảm ơn Linq đấy.

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

Bây giờ tôi muốn chuyển đổi của tôi IAsyncEnumerablethành một Listvà tất nhiên điều này không đồng bộ. Đã có triển khai Linq cho trường hợp đó? Nếu không, làm thế nào tôi có thể tự chuyển đổi nó?

Câu trả lời:


26

Chắc chắn - bạn chỉ cần ToListAsync()phương thức, trong System.Linq.Asyncgói NuGet . Đây là một ví dụ hoàn chỉnh:

Hồ sơ dự án:

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

Mã số:

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

Cảm ơn vì điều đó, thật thú vị khi nó chưa phải là một phần của .Net Core 3.1 Framework.
Hai mươi

4
@Toven: Là một gói riêng biệt, nó có thể dễ dàng sử dụng trên các nền tảng kéo dài trở lại.
Jon Skeet

@JonSkeet Nó bị lỗi khi sử dụng gói này và lõi Ado.Net.
ca9163d9

@ ca9163d9: "Nó bị lỗi" không thực sự cung cấp nhiều thông tin. Tôi đề nghị bạn hỏi một câu hỏi mới với một ví dụ tái tạo tối thiểu hoàn chỉnh .
Jon Skeet

@JonSkeet, sao chép nó ngay bây giờ. Nó đã thất bại await iOrderedQueryable.ToListAsync(cancellationToken)sau khi thêm gói nuget. Lỗi đã biến mất sau khi tôi gỡ bỏ gói nuget.
ca9163d9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.