【发布时间】:2010-12-14 17:43:23
【问题描述】:
是否可以将以下转换为更简单、更易读的 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。
如果我的解释没有意义,请告诉我,我会尝试详细说明。
编辑
乔恩, 当我尝试编译您所建议的内容时,我收到 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);
【问题讨论】:
-
使用泛型类型 'System.Collections.Generic.List
' 需要 '1' 类型参数。 -
我已经根据 Jon 的初始回答提供了更新的代码。
-
我已经编辑了我的答案以使用另一个
from子句而不是join... 虽然听起来你根本不需要那个位,真的。
标签: c# linq loops lambda nested-loops