私はサーバー内のすべてのデータベースのリストを取得し、最終的にそれらを出力しようとしています(つまり、それらの名前をstring
sとして使用しています)。以前のバージョンのc#ドライバーでは、Server.GetDatabases()
を呼び出すことができましたが、ListDatabasesAsync()
に置き換えられました。
戻り値はIAsyncCursor<>
そして、私はそれをどうするかわかりません。このようなカーソルを使用して、データベース(または何か)のリストをどのように反復しますか?
短い答え:ForEachAsync
拡張メソッドを使用:
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
長い答え: C#の従来の反復はIEnumerable
とforeach
で行われます。 foreach
はコンパイラの構文糖衣です。実際には、GetEnumerator
、using
スコープ、およびwhile
ループへの呼び出しです。しかし、それは非同期操作をサポートしていません:
using (var enumerator = enumerable.GetEnumerator())
{
while (enumerator.MoveNext())
{
var current = enumerator.Current;
// use current.
}
}
IAsyncCursor
はIEnumerator
(IEnumerable.GetEnumerator
の結果)と同等ですが、IAsyncCursorSource
はto IEnumerable
です。違いは、これらがasync
をサポートすることです(単一のアイテムだけでなく、反復ごとにバッチを取得します)。 foreach
はIEnumerable
用に作成されているため、使用できませんが、using
、while
ループ全体を実装できます。
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}
ただし、これは定型句が多いため、ドライバーはIAsyncCursor
、ForEachAsync
などのToListAsync
の拡張メソッドを追加します。
これは、最も一般的な使用例をカバーしていますが、他の場合でも、自分で反復を実装する必要があります。