C# - Lambda 与嵌套循环

标签 c# linq loops lambda nested-loops

是否可以将以下转换为更简单、更易读的 linq 或 lambda 表达式?

Dictionary<int, int> selectedProgramTierCombo = new Dictionary<int,int>();
foreach (int mainTierID in doc.TierID)
{
    foreach (PriceProgram priceProgram in doc.CommitmentProgram.PricingPrograms)
    {
        foreach (ProgramTier progTier in priceProgram.Tiers)
        {
            if (progTier.TierID == mainTierID )
            {
                selectedProgramTierCombo.Add(priceProgram.ProgramID, progTier.TierID);
            }
        }
    }
}

本质上,doc.TierID 是客户端当前所在的 TierID 数组 (int[])。 doc 对象还包含一个包含 PriceProgram 列表的 CommitmentProgram 对象。因此,我要做的就是获取每个 TierID 的 PriceProgram.ProgramID。

PriceProgram 和 TierID 之间的关系是每个 PriceProgram 都有一个层列表(ProgramTier 对象)并且 ProgramTier 对象包含我们已经拥有的相应 TierID。

如果我的解释没有意义,请告诉我,我会尽力详细说明。

编辑

乔恩, 当我尝试编译您建议的内容时,出现The name 'priceProgram' does not exist in the current context 错误:

Dictionary<int, int> selectedProgramTierCombo = 
    (from mainTierID in doc.TierID 
     from priceProgram in doc.CommitmentProgram.PricingPrograms 
     **join progTier in priceProgram.Tiers on mainTierID equals progTier.TierID**
     select new { priceProgram.ProgramID, progTier.TierID }) 
    .ToDictionary(x => x.ProgramID, x => x.TierID);

最佳答案

当然,这非常简单 - 但我必须更改您的 selectedProgramTierCombo 的类型变量,否则无法编译:

编辑:糟糕,考虑到等级取决于 priceProgram,您需要另一个嵌套的 from子句,我认为:

Dictionary<int, int> selectedProgramTierCombo =
    (from mainTierID in doc.TierID
     from priceProgram in doc.CommitmentProgram.PricingPrograms
     from progTier in priceProgram.Tiers
     where mainTierID == progTier.TierID
     select new { priceProgram.ProgramID, progTier.TierID })
    .ToDictionary(x => x.ProgramID, x => x.TierID);

至少,这就是我认为你想要的。如果你能澄清你真正想要的而不是 List<int, int> (这是无效的)我们可以提供进一步的帮助。

说实话,我不清楚你为什么要使用 progTier完全-你知道progTier.TierIDmainTierID相同,除此之外你没有使用它......

关于C# - Lambda 与嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4442295/

相关文章:

c# - 从要在 OrderBy 中使用的方法返回表达式

c# - 使用 LINQ 插入

C - 超出索引元素的地址与整数相同

C# 使用 json.net 解析 git 提交列表

c# - 如何设置 WCF Self-Hosted REST 服务?

c# - 根据列字段删除重复项并修改它

c# - 寻找一种方法来缩短我的代码

c# - 使用 Active Directory 或成员数据库的 MVC 4 身份验证

c# - 最小起订量和参数属性继承

c++ - 为什么这个 IF 语句不在循环内打印