2

以下をより単純で読みやすい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が含まれているということです。

私の説明が意味をなさない場合はお知らせください。詳しく説明します。

編集

ジョン、私はあなたが提案したものをコンパイルしようとすると、現在のコンテキストエラーに「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);
4

3 に答える 3

4

絶対に、それは非常に簡単です-しかし、私はあなたの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であり、それ以外は使用していません...

于 2010-12-14T17:48:12.827 に答える
2

Jonの答えは正しい考えであり、コンパイルするには再配置する必要があります。ここに2つのオプションがあります。

var dict = (from mainTierID in doc.TierID
            join f in
                (from priceProgram in doc.CommitmentProgram.PricingPrograms
                    from progTier in priceProgram.Tiers
                    select new { priceProgram.ProgramID, progTier.TierID })
                on mainTierID equals f.TierID
            select f).ToDictionary(f => f.ProgramID, f => f.TierID);


var dict2 = (from priceProgram in doc.CommitmentProgram.PricingPrograms
                from progTier in priceProgram.Tiers
                join mainTierID in doc.TierID on progTier.TierID equals mainTierID
                select new { priceProgram.ProgramID, progTier.TierID })
            .ToDictionary(x => x.ProgramID, x => x.TierID);
于 2010-12-14T19:09:41.467 に答える
1

単一の種類は私を悩ませます、しかし私は求められているものに従わなければなりません。

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

これは私がより快適になるものです:

ILookup<int, int> selectedProgramTierCombo =
(
  from priceProgram in doc.CommitmentProgram.PricingPrograms
  from progTier in priceProgram.Tiers
  where doc.TierID.Any(mainTierID => mainTierID == progTier.TierID)
  select new
  {
    ProgramID = priceProgram.ProgramID,
    TierID = progTier.TierID
  }
).ToLookup(x => x.ProgramID, x => x.TierID);
于 2010-12-14T19:46:56.877 に答える