У меня не было времени полностью прокомментировать это, когда я ответил на это в выходные, но у меня было несколько вещей, которые я хотел сказать.Прежде всего, я согласен с комментаторами, что это очень похоже на домашнюю работу.Если бы вы что-то пробовали и столкнулись с неприятностями, я бы ожидал услышать, где ваша проблема.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);