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#中的传统迭代是使用IEnumerable
和foreach
。 foreach
是编译器的语法糖。 它实际上是对GetEnumerator
的调用,一个using
范围和一个while
循环。 但是这不支持异步操作:
using (var enumerator = enumerable.GetEnumerator()) { while (enumerator.MoveNext()) { var current = enumerator.Current; // use current. } }
IAsyncCursor
等同于IEnumerator
( IEnumerator
的结果),而IAsyncCursorSource
是IEnumerable
。 不同之处在于这些支持async
(并且每次迭代都获得批处理,而不仅仅是单个项目)。 你不能使用foreach
因为它是为IEnumerable
构建的,但你可以实现整个using
, while
循环的东西:
IAsyncCursorSource cursorSource = null; using (var asyncCursor = await cursorSource.ToCursorAsync()) { while (await asyncCursor.MoveNextAsync()) { foreach (var current in asyncCursor.Current) { // use current } } }
然而,这是很多样板,因此驱动程序为IAsyncCursor
添加了扩展方法,如ForEachAsync
, ToListAsync
等等。
这涵盖了大多数常见用例,但对于其他用户,您仍需要自己实现迭代。