【问题标题】:c# Linq expression to replace foreach with multiple awaitsc#Linq表达式用多个等待替换foreach
【发布时间】:2023-02-03 14:12:27
【问题描述】:

我试图确定是否存在与下面的 foreach 语句等效的 linq 表达式?

我尝试过的几种解决方案中有两种在循环下方对其结果进行了评论。我认为第一个示例或变体会起作用,但类型始终是 IEnumerable<Task> 除非我同步调用它,这让人感到担忧。

public async Task<IEnumerable<CompanySettings>> GetClientSettingsAsync()
{
    foreach(var company in await GetParticipatingCompaniesAsync())
    {
        settings.Add(new CompanySettings(company, await GetSyncDataAsync(company)));
    }

    // a's Type is IEnumerable<Task<CompanySetting>> and not IEnumerable<CompanySetting>
    // var a = (await GetParticipatingCompaniesAsync()).Select(async x => new CompanySettings(x, await GetSyncDataAsync(x)));
    // return a;


    // b's Type is correct it's also synchronous.  Does that matter?
    // var b = (GetParticipatingCompaniesAsync()).Result.Select(x => new CompanySettings(x, GetSyncDataAsync(x).Result));
    //return b;

    return settings;
}

【问题讨论】:

    标签: c# linq async-await


    【解决方案1】:

    您的第一次尝试已经接近尾声,您只需要等待返回的任务

    async Task<IEnumerable<CompanySettings>> GetClientSettingsAsync() {
    
        var companies = await GetParticipatingCompaniesAsync();
        var companySettings = companies.Select(async company =>
            new CompanySettings(company, await GetSyncDataAsync(company))
        );
    
        return await Task.WhenAll(companySettings);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 2015-05-22
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多