2010-06-04 17 views
8

Nur um Linq herumzukommen und viel Spaß zu haben! Kann jemand mir mit einer Abfrage für diese Hilfe:
ich eine Liste von Daten: LINQ: Auswählen von Elementen aus einer Liste (Gruppieren nach/Auswählen/Summe und Max!)

 
    Key Value 
    Aaa 12 
    AaA 10 
    AAa 5 
    BBB 2 
    Bbb 1 
1. Ich von Key.ToUpper gruppieren möchten (der)
2. Für jede Gruppe muss ich die Max (Value) & Sum (Wert)
3. Für jede Gruppe I die Einträge auswählen möchten Dort wird der Wert = Max (Wert)
das Endergebnis so sein sollte:
 
    Key Max Total 
    AaA 12 27 
    AAa 12 27 
    Bbb 2 3
Dank!

aktualisieren, eigentlich brauche ich auch den Schlüssel aus dem Maximum Eintrag:

 
    Key Max Total Correct 
    AaA 12 27 Aaa 
    AAa 12 27 Aaa 
    Bbb 2 3  BBB

+3

Klingt verdächtig wie Hausaufgaben. –

+0

Oder eine Interviewfrage ... Hausaufgabe beinhaltet normalerweise nicht "ToUpper" –

+0

Keine Chaps, Sie würden aus meinem Profil sehen, dass ich ein wenig hinter Hausaufgaben bin :) Und nicht wirklich ein Pro Coder [mehr], nur zum Spaß :) –

Antwort

16

:)

var results = 
    from kvp in source 
    group kvp by kvp.Key.ToUpper() into g 
    select new 
    { 
    Group = g, 
    Max = g.Max(kvp => kvp.Value), 
    Total = g.Sum(kvp => kvp.Value) 
    } into ag 
    from x in ag.Group //SelectMany 
    where x.Value != ag.Max 
    //for the update to the question - note: possibly ambiguous 
    let correct = ag.Group.Where(y => y.Value == ag.Max).First().Key 
    select new 
    { 
    Key = x.Key, 
    Max = ag.Max, 
    Total = ag.Total, 
    Correct = correct 
    }; 

ich ein bisschen wie die Frage, weil all die kleinen Teile (einige selten verwendet werden), das sind benötigt, um die Antwort zu geben.


Max = g.Max(kvp => kvp.Value), 
Total = g.Sum(kvp => kvp.Value) 

Falls mehrere Aggregationen auf eine Gruppe ist einfach, dennoch schwierig, wenn Sie nicht wissen, wie.


select a into b 

Diese Klausel nimmt alles, was zuvor passiert und startet eine neue Abfrage mit dem Ziel.

var A = ... select a 

var B = from b in A 

Es ist wichtig zu beachten, dass die select into Klausel entfernt kvp und g von -umfang: Ohne sie würde ich eine neue Abfrage, wie dies von vorn anfangen.


from b in source 
    from a in b.A //SelectMany 

Dieses „Auspacken“ des Kindes Sammlung dreht sich meine Frage über bs in eine Abfrage über eine der. Im Gegensatz zur standardmäßigen Enumerable.SelectMany-Überladung wird das übergeordnete Element (b) im Gültigkeitsbereich beibehalten.


where x.Value != ag.Max 

einer Immobilie Kind Vergleich mit einer Eigenschaft der Eltern? Herrlich. Es ist wichtig, daran zu denken, where zu brechen, wann immer Sie filtern möchten, selbst wenn Sie nur gruppiert haben (es gibt keine HAVING).

+0

Wowsers, schnelle Antwort & perfekt. Danke! –

+0

Froh, dass ich die weniger verwendeten Teile von LINQ kitzeln könnte. Ich denke, der kleine Zusatz macht es etwas schwieriger? –

+0

Aktualisiert. Die Mehrdeutigkeit ergibt sich aus der Möglichkeit, dass mehrere Zeilen denselben maximalen Wert haben können. Ich möchte auch erwähnen, dass, wenn alle Zeilen für einen bestimmten Schlüssel den gleichen Wert haben, keine Zeilen zurückgegeben werden. –

Verwandte Themen