Как IAsyncCursor используется для итерации с драйвером С# mongodb?

Я пытаюсь получить список всех баз данных на моем сервере и в конечном итоге распечатать их (т.е. использовать их имена как string s). С предыдущей версией драйвера С# я мог бы вызвать Server.GetDatabases(), но был заменен на ListDatabasesAsync().

Возвращаемое значение - это IAsyncCursor<>, и я не уверен, что с ним делать. Как один из них перебирает список баз данных (или что-то еще) с таким курсором?

Ответы

Ответ 1

Короткий ответ: используйте метод расширения ForEachAsync:

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

Длинный ответ: Традиционная итерация в С# выполняется с помощью IEnumerable и foreach. foreach - это синтаксический сахар компилятора. Это фактически вызов области GetEnumerator, a using и цикла while. Но это не поддерживает асинхронные операции:

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

IAsyncCursor эквивалентен IEnumerator (результат IEnumerable.GetEnumerator), а IAsyncCursorSource равен 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 и так далее.

Это относится к большинству распространенных случаев использования, но для других вам по-прежнему необходимо реализовать итерацию самостоятельно.