2009-07-21 8 views
7

私は次のような構造を持つレコードのリストを持っている:(!簡略化した例)LINQでの複数レベルのグループ化?

class Rate 
{ 
    string Code; 
    double InterestFrom; 
    double InterestTo; 
    double IncomeFrom; 
    double IncomeTo; 
    double Value; 
} 

そして、はい、私はリスト<レート>が定義されています。

class RateList 
{ 
    List<Code> code; 
} 
class Code 
{ 
    string code; 
    List<Interest> interest; 
} 
class Interest 
{ 
    double InterestFrom; 
    double InterestTo; 
    List<Income> income; 
} 
class Income 
{ 
    double IncomeFrom; 
    double IncomeTo; 
    double Value; 
} 

そして私は、単一のLINQクエリでこれを行うしたいと思います:私は、次の簡略化構造にこのリストを変換する必要があります。私は他のソリューションを試すことができますが、1つのLINQステートメントでそれを行うことが課題です。 基本的に、トップレベルのグループはコード別にグループ化されています。次のレベルは、InterestFromとInterestToの値であり、最も低いレベルはIncomeFrom、IncomeToおよびValueのリストです。

これでLINQ文はどうなりますか?

+0

あなたが入力料金と所望の出力のリストを提供することができますか? –

+0

目的の出力は、RateListタイプの単一のオブジェクトです。 InterestFrom/InterestToとIncomeFrom/IncomeToは、すべてのコードの繰り返し値です。記録の例は、( "AB"、0,6,10000,20000,40.3)または( "AB"、6,7.5,10000,20000,40.3)である。 –

+0

あなたは「最低レベルはIncomeFromとIncomeToによってグループ化されています」と述べています。 - これが当てはまる場合、「価値」は合計されますか?それとも、それらの価値観をグループ化するという意味ではありませんか? (関心で止まる) –

答えて

18

これはかなり巨大であるが、ここで私が持っているものです。

var rateList = new RateList 
       { 
        code = (from r in rates 
          group r by r.Code into g 
          select new Code 
          { 
           code = g.Key, 
           interest = (from i in g 
              group i by new {i.InterestFrom, i.InterestTo} into g2 
              select new Interest 
              { 
               InterestFrom = g2.Key.InterestFrom, 
               InterestTo = g2.Key.InterestTo, 
               income = (from inc in g2 
                 select new Income 
                 { 
                  IncomeFrom = inc.IncomeFrom, 
                  IncomeTo = inc.IncomeTo, 
                  Value = inc.Value 
                 }).ToList() 
              }).ToList() 
          }).ToList() 
       }; 
+0

巨大で問題ありません。 :-)それが単一のステートメントで実行できるかどうかを知りたいだけです。 (そして、それが可読であるかどうかをチェックする...) –

+0

これは私が今それを行うと考えることができる最も簡潔な方法です。私があなたがそれを短縮するために知っている唯一の良い方法は、それらのクラスにいくつかの単純なコンストラクタを持たせることです。あまり切れないだろうが、少し助けになるだろう。 –

+0

コードをチェック!できます!それはモンスターの声明ですが、もう一度、私はそれほど経験の浅い開発者がそれを変更することをお勧めしません。正直言って、それはまだ非常に読みやすいです。 –

関連する問題