是否可以将以下转换为更简单、更易读的 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.TierID
与mainTierID
相同,除此之外你没有使用它......
关于C# - Lambda 与嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4442295/