:)
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
};
ho un po 'come la domanda a causa di tutte le piccole parti (alcuni sono usati raramente) che sono necessario per fare la risposta.
Max = g.Max(kvp => kvp.Value),
Total = g.Sum(kvp => kvp.Value)
Esecuzione di più aggregazioni su un gruppo è molto semplice, ma impegnativo se non si sa come.
select a into b
Questa clausola prende tutto quello che è successo prima e inizia una nuova query con il bersaglio. Senza di essa, avrei dovuto iniziare una nuova query come questa:
var A = ... select a
var B = from b in A
E 'importante notare che la clausola select into
rimuove kvp
e g
dal campo di applicazione.
from b in source
from a in b.A //SelectMany
Questa "spacchettamento" della collezione bambino compie il mio messaggio relativo a B è in una query su un di. A differenza del sovraccarico predefinito Enumerable.SelectMany, lascia il genitore (b
) in ambito.
where x.Value != ag.Max
Confrontando proprietà di un bambino con la proprietà di un genitore? Delizioso. È importante ricordare di scoppiare where
ogni volta che si desidera filtrare, anche se è stato appena raggruppato (non esiste HAVING
).
fonte
2010-06-04 01:06:24
Suoni sospettosamente come i compiti. –
Oppure una domanda di intervista ... i compiti a casa di solito non coinvolgono "ToUpper" –
Nessuno dei due, vedresti dal mio profilo che sono un po 'di compiti passati :) E non proprio un programmatore professionista [più], solo per divertimento :) –