我试图获得服务器中所有数据库的列表,并最终打印出来(即使用它们的名称作为string
).对于以前版本的c#driver,我可以称之为Server.GetDatabases()
,但它已被ListDatabasesAsync()
取代.
返回值是IAsyncCursor<>
,我不知道该怎么处理它.如何用这样一个游标遍历数据库列表(或任何东西)?
我试图获得服务器中所有数据库的列表,并最终打印出来(即使用它们的名称作为string
).对于以前版本的c#driver,我可以称之为Server.GetDatabases()
,但它已被ListDatabasesAsync()
取代.
返回值是IAsyncCursor<>
,我不知道该怎么处理它.如何用这样一个游标遍历数据库列表(或任何东西)?
你有3个 Select :
ForEachAsync
、ToListAsync
).IAsyncCursor
转换为IAsyncEnumerable
,并使用await foreach
或任何异步LINQ运算符.IAsyncCursor
次.对于IAsyncCursor
,驱动程序有一些类似LINQ的扩展方法,比如AnyAsync
、ToListAsync
等.对于迭代,它有ForEachAsync
:
var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
IAsyncEnumerable
在C#8.0及更高版本上,使用await foreach
进行迭代(并使用异步LINQ)要好得多.这需要将IAsyncCursor
包裹在IAsyncEnumerable
中.
var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
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
(并在每次迭代中获得一批,而不仅仅是一个项目).所以你可以自己实现整个using
while
循环:
IAsyncCursorSource<int> cursorSource = null;
using (var asyncCursor = await cursorSource.ToCursorAsync())
{
while (await asyncCursor.MoveNextAsync())
{
foreach (var current in asyncCursor.Current)
{
// use current
}
}
}