IAsyncEnumerable的Linq方法

46

在使用 IEnumerable<T> 时,可以使用来自 System.Linq 命名空间的内置扩展方法,如 SkipWhereSelect

当 Microsoft 在 C#8 中添加了 IAsyncEnumerable 时,是否也添加了新的 Linq 方法来支持它?

我当然可以自己实现这些方法,或者找到一些包来完成,但如果存在语言标准方法,我更愿意使用它。


1
是的,您可以在异步可枚举对象中使用linq。 - Glenn van Acker
3
你可以使用System.Linq.Async来实现这个。 - Panagiotis Kanavos
2个回答

60

GitHub的问题已经关闭了,这是否意味着它不会被添加到语言中,我们将始终需要使用外部包? - GWigWam
6
因为它已经在另一个包中可用,而且在NuGet上已经可以获取。即使LINQ是一个“外部包”- 它通过NuGet可用,但你可能没有意识到这一点,因为它会作为几乎每个模板的依赖项下载。 - Panagiotis Kanavos
10
更新:System.Linq.Async 现在似乎是一个单独的包了:https://www.nuget.org/packages/System.Linq.Async。 - Benno Straub
1
似乎是扩展方法 FirstOrDefaultAsync(),它需要传入一个预期的 CancellationToken - Steve Friedl
1
请注意,FirstOrDefaultAsync() 的返回类型是 ValueTask<T>,而不是 Task<T> - Steve Friedl
1
对于那些被提到的所有包感到困惑的人:您需要的是 NuGet 包 System.Linq.Async(而不是 System.Interactive)。该包在命名空间 System.Linq 中公开其异步 Linq 扩展。 - 3dGrabber

0

自从 .NET 7 开始,你可以使用 .ToBlockingEnumerable()IAsyncEnumerable<T> 转换为 IEnumerable<T>,然后就可以在其上调用 LINQ 方法了。


1
问题是关于Linq对IAsyncEnumerable的支持。您的回答将异步集合降级为阻塞同步游标,这不是异步编程的最佳方法。 - Lord of the Goo
这是公平的,取决于某人试图调用哪个 LINQ 方法可能是必要的(例如,Sum、Count、ToList 等)。但这是一个好的事情要注意。我很高兴方法名中有“Blocking”! - UnionP
这是公平的,取决于某人试图调用的LINQ方法,这可能是必要的(例如,Sum,Count,ToList等)。但是提前说明是一件好事。我很高兴方法名称中有“Blocking”! - undefined
3
对于考虑使用此功能的任何人,请确保您非常清楚地了解“阻塞”意味着什么。这是在避免不可避免的情况下的最后一招,应该谨慎使用。 - Chris Jensen

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