在尝试在async
中使用IEnumerable.SelectMany
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));
有办法绕过这件事吗?
发布于 2021-10-15 12:22:42
使用C#8和IAsyncEnumerable
,我们可以更自然地编写:
public static async IAsyncEnumerable<R> SelectManyAsync<T, R>(this IEnumerable<T> ts,
Func<T, Task<IEnumerable<R>>> func)
{
foreach (var t in ts)
{
var rs = await func(t);
foreach (var r in rs)
yield return r;
}
}
注意:使用await foreach(...
在IAsyncEnumerable
上迭代
https://stackoverflow.com/questions/33495617
复制相似问题