:)
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
};
Я вроде как вопрос, потому что все маленькие части (некоторые из них используются редко), которые являются чтобы ответить.
Max = g.Max(kvp => kvp.Value),
Total = g.Sum(kvp => kvp.Value)
Выполнение нескольких агрегатов на группе проста, но сложно, если вы не знаете, как это сделать.
select a into b
Эта статья берет все, что происходило до и начинается новый запрос с целью. Без него, я должен был бы начать новый запрос, как это:
var A = ... select a
var B = from b in A
Важно отметить, что положение select into
удаляет kvp
и g
от объема.
from b in source
from a in b.A //SelectMany
Эта «распаковка» коллекции детской превращает мой запрос о б х в запрос о х. В отличие от перегрузки по умолчанию Enumerable.SelectMany, она оставляет родительский объект (b
) в области видимости.
where x.Value != ag.Max
Сравнивая имущество ребенка с имуществом родителя? Восхитительный. Важно помнить о том, чтобы разбить where
в любое время, когда вы хотите отфильтровать, даже если вы просто сгруппированы (нет HAVING
).
Звучит подозрительно, как домашнее задание. –
Или вопрос на собеседование ... домашняя работа обычно не связана с «ToUpper» –
Ни гвоздями, ни вы не увидите из моего профиля, что я немного прошёл домашнее задание :) И не совсем прокодер [больше], просто для развлечения :) –