:)
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
).
Klingt verdächtig wie Hausaufgaben. –
Oder eine Interviewfrage ... Hausaufgabe beinhaltet normalerweise nicht "ToUpper" –
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ß :) –