IAsyncEnumerableをリストに変換


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.AsyncNuGetパッケージにあるメソッドだけです。以下は完全な例です。

プロジェクトファイル:

<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:個別のパッケージとして、元に戻るプラットフォームで簡単に使用できます。
ジョンスキート

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