是否可以将以下内容转换为更易读的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对象还包含一个CommitmentProgram对象,该对象包含PriceProgram的列表。因此,我要做的就是获取每个TierID的PriceProgram.ProgramID。

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

如果我的解释没有道理,请告诉我,我会尽力阐述。

编辑

乔恩
我正在尝试编译您建议的内容时,当前上下文错误中不存在名称“ priceProgram”:

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# - C#-Lambda与嵌套循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4442295/

10-12 23:35