🔄
C# で IAsyncEnumerable<T> を List<T> に変換する
Azure SDK には結果を AsyncPageable<T>
クラスで返すものが多くあります。さらにそこから AsyncPageable<T>.AsPages
メソッドを呼び出すと IAsyncEnumerable<T>
インターフェースの結果が得られます。IAsyncEnumerable<T>
インターフェースは非同期ストリームと呼ばれるもので、効率的にデータを読み取ることができますが、残念ながら List<T>
に変換するためのメソッドはありません。
いい方法がないかなと思っていたら System.Linq.Async
に ToListAsync<T>
メソッドがありました。みんな大好き Reactive Extensions に含まれるパッケージですね。
ToListAsync<T>
メソッドはそのままでは後続のメソッド チェーンができないので、AsTask
メソッドや ContinueWith
メソッドを使ってつなげることになります。具体的には以下のようなコードになります。
var blobContainerClient = new BlobContainerClient("{{connectionstring}}", "{{containername}}");
var blobNames = await blobContainerClient
.GetBlobsAsync()
.ToListAsync()
.AsTask()
.ContinueWith(task => task.Result.Select(_ => _.Name));
Microsoft のドキュメントにも記載がありました。
Discussion
ContinueWith メソッドを使わず
または
ではどうでしょうか?
コメントありがとうございます。
そうですね、await を () で囲むのが個人的に好きでなかったのでいつも ContinueWith を使っているのを忘れていました。ご指摘ありがとうございます!