Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取列表中最常出现的前三位数字_C#_List_Linq - Fatal编程技术网

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()不需要