当我尝试在IEnumerable.SelectMany
中使用async
lambda时,我得到了以下错误:
var result = myEnumerable.SelectMany(async (c) => await Functions.GetDataAsync(c.Id));
无法从用法推断方法“IEnumerable System.Linq.Enumerable.SelectMany(this IEnumerable,Func〉)”的类型参数。请尝试显式指定类型参数
其中GetDataAsync
定义为:
public interface IFunctions {
Task<IEnumerable<DataItem>> GetDataAsync(string itemId);
}
public class Functions : IFunctions {
public async Task<IEnumerable<DataItem>> GetDataAsync(string itemId) {
// return await httpCall();
}
}
我猜是因为我的GetDataAsync
方法实际上返回了一个Task<IEnumerable<T>>
,但是为什么Select
可以工作,它肯定会抛出同样的错误吗?
var result = myEnumerable.Select(async (c) => await Functions.GetDataAsync(c.Id));
有什么办法吗?
4条答案
按热度按时间yvgpqqbh1#
这是一个扩展:
允许您运行:
说明:你有一个任务列表,每个任务都返回
Task<IEnumerable<T>>
。所以你需要把它们都启动,然后等待所有任务,然后通过SelectMany压缩结果。wlzqhblo2#
异步lambda表达式无法转换为简单
Func<TSource, TResult>
。因此,无法使用select many。您可以在同步上下文中运行:
或
您也不能使用
yield return
-这是设计使然。例如:型
7eumitmz3#
Select
工作是因为它将返回IEnumerable<Task<T>>
,然后可以使用例如Task.WhenAll
来等待该IEnumerable<Task<T>>
。因此,解决此问题的简单方法是:
cxfofazt4#
使用C#8和
IAsyncEnumerable
,我们可以更自然地写出:注意:使用
await foreach(...
迭代IAsyncEnumerable