web-dev-qa-db-ja.com

IAsyncCursorは、mongodb c#ドライバーでの反復にどのように使用されますか?

私はサーバー内のすべてのデータベースのリストを取得し、最終的にそれらを出力しようとしています(つまり、それらの名前をstringsとして使用しています)。以前のバージョンのc#ドライバーでは、Server.GetDatabases()を呼び出すことができましたが、ListDatabasesAsync()に置き換えられました。

戻り値はIAsyncCursor<>そして、私はそれをどうするかわかりません。このようなカーソルを使用して、データベース(または何か)のリストをどのように反復しますか?

19
Shamster

短い答え:ForEachAsync拡張メソッドを使用:

var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));

長い答え: C#の従来の反復はIEnumerableforeachで行われます。 foreachはコンパイラの構文糖衣です。実際には、GetEnumeratorusingスコープ、およびwhileループへの呼び出しです。しかし、それは非同期操作をサポートしていません:

using (var enumerator = enumerable.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        var current = enumerator.Current;
        // use current.
    }
}

IAsyncCursorIEnumeratorIEnumerable.GetEnumeratorの結果)と同等ですが、IAsyncCursorSourceはto IEnumerableです。違いは、これらがasyncをサポートすることです(単一のアイテムだけでなく、反復ごとにバッチを取得します)。 foreachIEnumerable用に作成されているため、使用できませんが、usingwhileループ全体を実装できます。

IAsyncCursorSource<int> cursorSource = null;

using (var asyncCursor = await cursorSource.ToCursorAsync())
{
    while (await asyncCursor.MoveNextAsync())
    {
        foreach (var current in asyncCursor.Current)
        {
            // use current
        }
    }
}

ただし、これは定型句が多いため、ドライバーはIAsyncCursorForEachAsyncなどのToListAsyncの拡張メソッドを追加します。

これは、最も一般的な使用例をカバーしていますが、他の場合でも、自分で反復を実装する必要があります。

27
i3arnon