c# - 如何将异步 lambda 与 SelectMany 一起使用?

标签 c# linq lambda linq-to-objects

尝试使用 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/

相关文章:

c#锁问题: lock(this) vs lock(SyncRoot)

c# - Xamarin Android C# - 使用 Microsoft.SqlServer.Management

c# - 更改/修改现有 keyValuePair 中的数据

c# - 从数据集中的 X 表中获取最大日期值

c++ - 在三元运算符中初始化捕获 lambda

c# - 通过 lambda 找出一个列表是否包含另一个列表值

c# - 使用 Mud Blazor,我如何在页面底部获得一个持久抽屉?

c# - asp .net 核心应用程序未在 IE 和 EDGE 中设置响应 cookie,但在 firefox 和 chrome 中运行良好

c# - 选择常量并与另一个列表并集

java - 方法引用中的参数