C# 获取列表中最常出现的前三位数字
假设我有一个整数列表。 我添加了一些值:C# 获取列表中最常出现的前三位数字,c#,list,linq,C#,List,Linq,假设我有一个整数列表。 我添加了一些值: list.Add(5); list.Add(5); list.Add(27); list.Add(3); list.Add(4); list.Add(4); list.Add(29); list.Add(3); 如何获取发生次数最多的3?像这样:5,3和4 我试过: public static IEnumerable<T> Mode<T>(this IEnumerable<T> input) {
list.Add(5);
list.Add(5);
list.Add(27);
list.Add(3);
list.Add(4);
list.Add(4);
list.Add(29);
list.Add(3);
如何获取发生次数最多的3?像这样:5,3和4
我试过:
public static IEnumerable<T> Mode<T>(this IEnumerable<T> input)
{
var dict = input.ToLookup(x => x);
if (dict.Count == 0)
return Enumerable.Empty<T>();
var maxCount = dict.Max(x => x.Count());
return dict.Where(x => x.Count() == maxCount).Select(x => x.Key);
}
公共静态IEnumerable模式(此IEnumerable输入)
{
var dict=input.ToLookup(x=>x);
如果(dict.Count==0)
返回可枚举的.Empty();
var maxCount=dict.Max(x=>x.Count());
返回dict.Where(x=>x.Count()==maxCount)。选择(x=>x.Key);
}
但它只返回一个号码。您可以使用Linq:
var top3 = list.GroupBy(x => x)
.OrderByDescending(x => x.Count())
.Take(3)
.Select(x => x.Key);
Console.WriteLine(string.Join(" ", top3)); // output 5 3 4
这应该行得通
var topThreeMostOccuring = arr.GroupBy(x => x)
.OrderByDescending(g => g.Count())
.SelectMany(x => x.Take(1)).Take(3);
希望这对你有帮助
var list = new List<int>();
list.Add(5);
list.Add(5);
list.Add(27);
list.Add(4);
list.Add(3);
list.Add(4);
list.Add(4);
list.Add(29);
list.Add(3);
list.Add(5);
list.Add(4);
var TheMostoccurring = list.GroupBy(n => n).OrderByDescending(m => m.Count()).Select(m => m.Key).ToList().Take(3);
foreach (var item in TheMostoccurring)
{
Console.WriteLine(item);
}
var list=newlist();
增加(5);
增加(5);
增加(27);
增加(4);
增加(3);
增加(4);
增加(4);
增加(29);
增加(3);
增加(5);
增加(4);
var TheMostoccurring=list.GroupBy(n=>n).OrderByDescending(m=>m.Count()).Select(m=>m.Key).ToList().Take(3);
foreach(发生前的var项目)
{
控制台写入线(项目);
}
到目前为止您尝试了什么?下面的解决方案都涉及到对集合进行排序。如果您想要一个O(N)解决方案(比O(N log(N))更高效)排序,指定三个整数变量来保存前三个数字,并在集合中迭代,将当前值与这三个值进行比较。@Flydog57如果您想要最大的三个数字,这一点很有效。但是在这种情况下,您必须跟踪数字的出现次数,因此您还需要有三个变量使用字典保存所有看到的数字的当前计数。SelectMany
用于对可枚举的可枚举数据进行扁平化,您只需执行Select(x=>x.Key)
而不是SelectMany
。是的,对不起。你的解决方案很有效。我的标签不够大,无法显示所有的数字……让我哑口无言。再次感谢!顺便说一句,这是更好的方法。@juharr我很抱歉,这是我的错误ToList()不需要