🔄
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("{{connection-string}}", "{{containe-rname}}");
var blobNames = await blobContainerClient
.GetBlobsAsync()
.ToListAsync()
.AsTask()
.ContinueWith(task => task.Result.Select(_ => _.Name));
Microsoft のドキュメントにも記載があります。
Discussion
ContinueWith メソッドを使わず
または
ではどうでしょうか?
コメントありがとうございます。
そうですね、await を () で囲むのが個人的に好きでなかったのでいつも ContinueWith を使っているのを忘れていました。ご指摘ありがとうございます!