🔄
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 を使っているのを忘れていました。ご指摘ありがとうございます!