我有一个这样的数组:
[2 1 2 4 3 3 1]
我正在使用这个...
var query = array.GroupBy(item => item)
.OrderByDescending(g => g.Count())
.Select(g => g.Key)
.First();
..获得第一个最常见的值(在这种情况下:2)
如果我想获得多个值(在这种情况下:2,3,1)怎么办?
我需要将此值添加到另一个临时数组以检查此tempArray.Count> 1。
答案 0 :(得分:1)
如果您希望所有群体都获得最高排名,您可以这样做:
var tmp = array
.GroupBy(item => item)
.OrderByDescending(g => g.Count())
.Select(g => new {
Item = g.Key
, Count = g.Count()
}).ToList();
var res = tmp
.TakeWhile(p => p.Count == tmp[0].Count)
.Select(p => p.Item)
.ToList();
请注意,检查tmp
列表计数为非零是不必要的,因为执行TakeWhile
条件的唯一方法是临时列表中至少有一个项目。换句话说,当tmp
为空时,永远不会达到lambda条件p => p.Count == tmp[0].Count
,并且永远不会抛出超出范围的异常。
答案 1 :(得分:1)
这就是我接近它的方法(为了清晰起见,拆分代码):
//Basic query
var query = array
.GroupBy(i => i);
//Get the maximum count number
var maxCount = query
.Max(i => i.Count());
//Get all the values that have a count of maxCount
var result = query
.Where(i => i.Count() == maxCount)
.Select(i => i.Key);
答案 2 :(得分:0)
如果您说要获得前3名结果:
var query = array.GroupBy(item => item)
.OrderByDescending(g => g.Count())
.Select(g => g.Key).Take(3);