我试图获取服务器中所有数据库的列表并最终将它们打印出来(即,将它们的名称用作string
)。在早期版本的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
等效于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
等。这涵盖了最常见的用例,但对于其他用例,您仍然需要自己实现迭代。
关于c# - IAsyncCursor如何与mongodb C#驱动程序一起用于迭代?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29682371/