我试图获取服务器中所有数据库的列表并最终将它们打印出来(即,将它们的名称用作string)。在早期版本的C#驱动程序中,我可以调用Server.GetDatabases(),但已将其替换为ListDatabasesAsync()

返回值是一个IAsyncCursor<>,我不确定该怎么做。如何用这样的游标遍历数据库列表(或其他任何事物)?

最佳答案

简短答案:使用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.
    }
}
IAsyncCursor等效于IEnumerator(IEnumerable.GetEnumerator的结果),而IAsyncCursorSource等效于IEnumerable。不同之处在于它们支持async(并在每次迭代中获得批处理,而不仅仅是单个项目)。您不能使用foreach,因为它是为IEnumerable构建的,但是您可以实现整个usingwhile循环:
IAsyncCursorSource<int> cursorSource = null;

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

但这是很多样板,因此驱动程序为IAsyncCursor添加了扩展方法,例如ForEachAsyncToListAsync等。

这涵盖了最常见的用例,但对于其他用例,您仍然需要自己实现迭代。

关于c# - IAsyncCursor如何与mongodb C#驱动程序一起用于迭代?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29682371/

10-10 15:28