gpt4 book ai didi

c# - IAsyncCursor 如何与 mongodb c# 驱动程序一起用于迭代?

转载 作者:IT老高 更新时间:2023-10-28 13:06:48 27 4
gpt4 key购买 nike

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

返回值为IAsyncCursor<>我不知道该怎么办。如何用这样的游标遍历数据库列表(或任何东西)?

最佳答案

您有 3 个选项:

  1. 使用内置驱动方法(例如ForEachAsyncToListAsync)。
  2. 在 C# 8.0 及更高版本上,您可以将 IAsyncCursor 转换为 IAsyncEnumerable 并使用 await foreach 或任何异步 LINQ 运算符。
  3. 遍历 IAsyncCursor
内置驱动方法

驱动程序有一些类似 LINQ 的 IAsyncCursor 扩展方法,如 AnyAsyncToListAsync 等。对于迭代,它具有 ForEachAsync:

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

在 C# 8.0 及更高版本上,使用 await foreach 进行迭代会更好(并使用异步 LINQ)。这需要将 IAsyncCursor 包装在 IAsyncEnumerable 中。你可以自己做,但是因为正确处理一些关键的事情(比如取消和处置)很重要,所以我发布了一个 nuget 包:MongoAsyncEnumerableAdapter

var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
Console.WriteLine(db["name"]);
}
自定义迭代

C# 中的传统迭代是通过 IEnumerableforeach 完成的。 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
}
}
}

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com