尝试使用 async
时出现以下错误IEnumerable.SelectMany
内的 lambda :
var result = myEnumerable.SelectMany(async (c) => await Functions.GetDataAsync(c.Id));
The type arguments for method 'IEnumerable System.Linq.Enumerable.SelectMany(this IEnumerable, Func>)' cannot be inferred from the usage. Try specifying the type arguments explicitly
在哪里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));
有什么办法解决这个问题吗?
最佳答案
这是一个扩展:
public static async Task<IEnumerable<T1>> SelectManyAsync<T, T1>(this IEnumerable<T> enumeration, Func<T, Task<IEnumerable<T1>>> func)
{
return (await Task.WhenAll(enumeration.Select(func))).SelectMany(s => s);
}
这允许你运行:
var result = await myEnumerable.SelectManyAsync(c => Functions.GetDataAsync(c.Id));
解释:你有一个任务列表,每个任务返回 Task<IEnumerable<T>>
.因此,您需要将它们全部触发,然后全部等待,然后通过 SelectMany 压缩结果。
关于c# - 如何将异步 lambda 与 SelectMany 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33495617/