首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在SelectMany中使用异步lambda?

如何在SelectMany中使用异步lambda?
EN

Stack Overflow用户
提问于 2015-11-03 09:32:58
回答 4查看 16.9K关注 0票数 40

在尝试在async中使用IEnumerable.SelectMany lambda时,我得到了以下错误

代码语言:javascript
运行
复制
var result = myEnumerable.SelectMany(async (c) => await Functions.GetDataAsync(c.Id));

不能从用法中推断方法“IEnumerable System.Linq.Enumerable.SelectMany(this IEnumerable,Func>)”的类型参数。尝试显式指定类型参数。

其中GetDataAsync被定义为:

代码语言:javascript
运行
复制
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要工作,当然它应该抛出同样的错误?

代码语言:javascript
运行
复制
var result = myEnumerable.Select(async (c) => await Functions.GetDataAsync(c.Id));

有办法绕过这件事吗?

EN

Stack Overflow用户

发布于 2021-10-15 12:22:42

使用C#8和IAsyncEnumerable,我们可以更自然地编写:

代码语言:javascript
运行
复制
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上迭代

票数 2
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33495617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档