我有一个列表:
姓名 国家 值 John Ireland 100 Mary UK 200 Peter Germany 300 Bob UK 100 Pat France 400
我需要按国家分组,然后按值的总和降序排序,最后取前 X 个值。
例如,List.TopX(3) 将返回以下结果:
France 400 UK 300 Germany 300
我有一个列表:
姓名 国家 值 John Ireland 100 Mary UK 200 Peter Germany 300 Bob UK 100 Pat France 400
我需要按国家分组,然后按值的总和降序排序,最后取前 X 个值。
例如,List.TopX(3) 将返回以下结果:
France 400 UK 300 Germany 300
周末回答这个问题时,我没有时间完全评论它,但我有一些想说的话。首先,我同意评论者的看法,这听起来非常像作业。如果你已经尝试过某些东西并且遇到了问题,我希望听到你的问题所在。Stack Overflow是关于专业人士互相帮助解决特定问题的地方,当他们尝试过所有方法仍然不能完全解决问题。这个问题有一个简单的回答(对于那些花时间阅读关于LINQ的文档的人来说)。我故意使用链式lambda符号而不是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);
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);
虽然没有输入编译器,但这应该是简单的部分-下载LINQPad,在http://dimecasts.net上查看LINQPad教程,就可以解决问题:P