2009-07-21 6 views
7

Ich habe eine Liste von Datensätzen mit der folgenden Struktur: (! Vereinfachtes Beispiel)Multi-Level-Gruppierung in LINQ?

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

Und ja, ich habe eine Liste <Rate> definiert. Ich brauche diese Liste an folgenden vereinfachen Struktur zu konvertieren:

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; 
} 

Und ich möchte dies mit einer einzigen LINQ-Abfrage tun. Ich kann andere Lösungen erarbeiten, aber die Herausforderung besteht darin, dies innerhalb einer LINQ-Anweisung zu tun. Grundsätzlich wird die oberste Gruppe nach Code gruppiert. Die nächste Ebene mit den Werten InterestFrom und InterestTo und der niedrigsten Ebene ist eine Liste von IncomeFrom, IncomeTo und Value.

Also, was wäre die LINQ-Anweisung dafür?

+0

Können Sie eine Liste der Eingabe Preise und die gewünschte Ausgabe liefern? –

+0

Die gewünschte Ausgabe ist ein einzelnes Objekt vom Typ RateList. InterestFrom/InterestTo und IncomeFrom/IncomeTo wiederholen Werte für jeden Code. Ein Beispielsatz wäre: ("AB", 0, 6, 10000, 20000, 40.3) oder ("AB", 6, 7.5, 10000, 20000, 40.3). –

+0

Sie erwähnen "die unterste Ebene ist nach IncomeFrom und IncomeTo gruppiert." - Wenn dies der Fall ist, wird der Wert addiert? Oder wollten Sie diese Werte nicht wirklich gruppieren? (Stoppt bei Interesse) –

Antwort

18

Das ist ziemlich groß, aber hier ist das, was ich habe:

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

Riesig ist kein Problem. :-) Ich will nur wissen, ob es in einer einzigen Aussage gemacht werden kann. (Und dann überprüfen, ob es lesbar bleibt ...) –

+0

Dies ist die prägnanteste Art und Weise, wie ich es jetzt machen kann. Der einzige gute Weg, den ich kenne, um es zu verkürzen, wäre, ein paar einfache Konstruktoren für diese Klassen zu haben. Es würde nicht zu viel ausschneiden, aber es würde ein wenig helfen. –

+0

Und überprüfte den Code! Es klappt! Es ist eine Monsteraussage, aber andererseits möchte ich die weniger erfahrenen Entwickler davon abhalten, sie zu modifizieren. Und um ehrlich zu sein, ist es immer noch gut lesbar. –