IAsyncEnumerable'ı Listeye Dönüştür


18

C # 8'de IAsyncEnumerablearayüzün eklenmesini sağladık.

Biz normal varsa IEnumerablebiz yapabilir Listveya hemen hemen herhangi bir başka koleksiyon biz bunun dışında istiyorum. Orada Linq sayesinde.

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

Şimdi benim ve bu zaman uyumsuz IAsyncEnumerablebir şekilde dönüştürmek istiyorum List. Bu dava için zaten Linq uygulamaları var mı? Eğer yoksa, kendim nasıl dönüştürebilirim?

Yanıtlar:


26

Elbette - sadece NuGet paketindekiToListAsync() yönteme ihtiyacınız varSystem.Linq.Async . İşte tam bir örnek:

Proje dosyası:

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

Bunun için teşekkürler, henüz .Net Core 3.1 Framework'ün bir parçası olmadığı ilginç.
Yirmi

4
@Twenty: Ayrı bir paket olarak, geri dönüş yapan platformlarda kolayca kullanılabilir.
Jon Skeet

@JonSkeet Bu paketi ve Ado.Net core kullanılırken hata alır.
ca9163d9

@ ca9163d9: "Hatayı alır" pek fazla bilgi vermez. Tamamen minimal tekrarlanabilir bir örnekle yeni bir soru sormanızı öneririm .
Jon Skeet

@JonSkeet, hemen şimdi çoğalttı. Başarısız olduawait iOrderedQueryable.ToListAsync(cancellationToken)Nuget paketi eklendikten sonra . Nuget paketini kaldırdıktan sonra hata gitti.
ca9163d9
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.