如何正确地使用IAsyncEnumerable与LINQ类型方法?

20

目前 .NET Core 中似乎没有包含 IAsyncEnumerable 的 Linq 支持。那么,如何正确地进行简单的操作,例如 ToList 和 Count?


4
如果你只是要调用ToList或Count,那么使用异步枚举方法的意义在哪里呢? - stuartd
6
为什么这个被关闭了?这是一个好的、清晰的问题。 - Stuart
4
请投票重新开放这个问题,它是有意义的,并且正如您所看到的,它有一个直截了当的答案。 - Stilgar
谢谢@Stilgar,我不知道那是个事情。 - Stuart
System.Linq.Async Nuget包。 - Theodor Zoulias
1
@stuartd,我使用可枚举对象和我如何使用它们是两回事。你肯定会遇到这样的情况:你需要异步可枚举对象中的所有数据才能处理,因此需要使用ToList()方法;而在其他情况下,你只需要在数据变得可用时对其进行处理。 - cubesnyc
1个回答

23

这是一个很好的问题,因为在默认的.NET Core应用程序中,使用隐式框架引用时,IAsyncEnumerable<T> 在 IntelliSense 中几乎没有有用的项。

预期您会像这样添加 System.Linq.Async 包(也称为 Ix Async,请参见此处):

<PackageReference Include="System.Linq.Async" Version="4.0.0" />

然后你可以使用 CountAsync 或者 ToListAsync

async IAsyncEnumerable<int> Numbers()
{
    yield return 1;
    await Task.Delay(100);
    yield return 2;
}

var count = await Numbers().CountAsync();
var myList = await Numbers().ToListAsync();

正如评论中指出的那样,这些方法单独使用并不是很有用,应该在使用更强大的特性时将数据保持为异步流,并配合像 SelectAwaitWhereAwait 等东西一起使用。


这些方法本身就有用途。如果我得到一个 IAsyncEnumerable 的 API,但我并不真正关心它的异步性,那该怎么办?难道我应该被迫自己进行 foreach-count 操作(这可能正是 CountAsync 所做的)吗? - Stilgar
你必须关注它的异步性,无法选择退出,这与“async”方法相同。除非你绝对知道自己在做什么,否则不要对其进行阻塞。 - Stuart
但是CountAsync不会阻塞。你只是在等待完整的序列。如果你使用await-foreach,然后在一个变量中计数,它会产生相同的效果。 - Stilgar
是的,我认为会有影响。我不确定我理解了你的第一条评论。 - Stuart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接