Linq: группировать список, сортировать его и получать топ-значения х? - PullRequest
4 голосов
/ 09 августа 2010

У меня есть список:

Name  Country    Value
John  Ireland    100
Mary  UK         200
Peter Germany    300
Bob   UK         100
Pat   France     400

Мне нужно сгруппировать список по стране, затем отсортировать по суммированным значениям DESC, затем взять верхние значения X

например. List.TopX (3) вернул бы

France  400
UK      300
Germany 300

Ответы [ 2 ]

12 голосов
/ 09 августа 2010

У меня не было времени полностью прокомментировать это, когда я ответил на это в выходные, но у меня было несколько вещей, которые я хотел сказать.Прежде всего, я согласен с комментаторами, что это очень похоже на домашнюю работу.Если бы вы что-то пробовали и столкнулись с неприятностями, я бы ожидал услышать, где ваша проблема.Stack Overflow - это профессионалы, которые помогают друг другу в решении конкретных проблем, когда они все перепробовали и не могут все сделать правильно.Этот вопрос имеет тривиальный ответ (для тех, кто потратил немного времени на чтение о LINQ).Я намеренно использовал цепочечную лямбда-нотацию, а не выражение LINQ, чтобы указать, что ответ на самом деле является прямым переводом вопроса:

var results = list.GroupBy(e => e.Country) // group the list by country
    .OrderByDescending(                 // then sort by the summed values DESC
        g => g.Sum(e => e.Value))  
    .Take(n)                            // then take the top X values
    .Select(                            // e.g. List.TopX(3) would return...
        r => new {Country = r.Key, Sum = r.Sum(e => e.Value)}); 

Если бы я действительно делал это для работы, я бы использовалследующие обозначения:

var results = from e in list
              group e.Value by e.Country into g
              let sum = g.Sum()
              orderby sum descending
              select new {g.Key, sum};
results = results.Take(n);
3 голосов
/ 09 августа 2010
var all = from item in list
group item by item.Country into byCountry
let count = byCountry.Sum(element=>element.Value)
orderby count descending
select byCountry.Key, count

var justTop = all.Take(3);

Не входит в компилятор, но это должно быть легко - Donwload LINQPad, посмотрите учебные пособия LINQPad на http://dimecasts.net, и он будет отсортирован: P

...