IAsyncCursor如何用于使用mongodb c#驱动程序进行迭代?

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

返回值是IAsyncCursor ,我不知道如何处理它。 如何用这样的游标遍历数据库列表(或任何东西)?

简答:使用ForEachAsync扩展方法:

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

答案很长: C#中的传统迭代是使用IEnumerableforeachforeach是编译器的语法糖。 它实际上是对GetEnumerator的调用,一个using范围和一个while循环。 但是这不支持异步操作:

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

IAsyncCursor等同于IEnumeratorIEnumerator的结果),而IAsyncCursorSourceIEnumerable 。 不同之处在于这些支持async (并且每次迭代都获得批处理,而不仅仅是单个项目)。 你不能使用foreach因为它是为IEnumerable构建的,但你可以实现整个usingwhile循环的东西:

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

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

这涵盖了大多数常见用例,但对于其他用户,您仍需要自己实现迭代。