2010-06-04 3 views
8

Просто получаю голову вокруг Linq и получаю массу удовольствия! Может ли один помочь мне с запросом для этого:
У меня есть список данных: LINQ: выбор элементов из списка (Group By/Select/Sum & Max!)

 
    Key Value 
    Aaa 12 
    AaA 10 
    AAa 5 
    BBB 2 
    Bbb 1 
1. Я хочу группу Key.ToUpper()
2. Для каждой группы мне нужно Макс (Value) & Суммы (Value)
3. для каждой группы я хочу, чтобы выбрать записи Там Value = Max (значение)
конечный результат должен быть таким:
 
    Key Max Total 
    AaA 12 27 
    AAa 12 27 
    Bbb 2 3
Спасибо!

Update, на самом деле я также нужен ключ от максимальной записи:

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

+3

Звучит подозрительно, как домашнее задание. –

+0

Или вопрос на собеседование ... домашняя работа обычно не связана с «ToUpper» –

+0

Ни гвоздями, ни вы не увидите из моего профиля, что я немного прошёл домашнее задание :) И не совсем прокодер [больше], просто для развлечения :) –

ответ

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

Я вроде как вопрос, потому что все маленькие части (некоторые из них используются редко), которые являются чтобы ответить.


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).

+0

Wowsers, быстрый ответ и идеальный. Спасибо! –

+0

Рад, что я мог пощекотать меньшие использованные части LINQ. Я думаю, что небольшое дополнение делает его несколько более сложным? –

+0

Обновлено. Неоднозначность возникает из-за того, что несколько строк могут иметь одинаковое максимальное значение. Также хочу отметить, что если все строки для данного ключа имеют одинаковое значение, то строки не возвращаются. –

Смежные вопросы