首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找List<int>中出现次数最多的数字

查找List<int>中出现次数最多的数字
EN

Stack Overflow用户
提问于 2008-12-10 12:55:29
回答 5查看 26.2K关注 0票数 30

有没有使用linq的又快又好的方法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-12-10 13:05:52

这样如何:

代码语言:javascript
复制
var most = list.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
      .Select(grp=>grp.Key).First();

或者在查询语法中:

代码语言:javascript
复制
var most = (from i in list
            group i by i into grp
            orderby grp.Count() descending
            select grp.Key).First();

当然,如果您要重复使用此方法,则可以添加一个扩展方法:

代码语言:javascript
复制
public static T MostCommon<T>(this IEnumerable<T> list)
{
    return ... // previous code
}

然后,您可以使用:

代码语言:javascript
复制
var most = list.MostCommon();
票数 85
EN

Stack Overflow用户

发布于 2008-12-10 13:08:38

不确定lambda表达式,但我会

  1. Sort the list O(n

n)

  1. Scan the list O(n) list the log

it

  1. O(n) reporting每个数字都具有该游程长度。

这是因为可能有不止一个出现次数最多的数字。

票数 5
EN

Stack Overflow用户

发布于 2013-05-31 13:01:35

摘自我的答案here

代码语言:javascript
复制
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);
}

var modes = { }.Mode().ToArray(); //returns { }
var modes = { 1, 2, 3 }.Mode().ToArray(); //returns { 1, 2, 3 }
var modes = { 1, 1, 2, 3 }.Mode().ToArray(); //returns { 1 }
var modes = { 1, 2, 3, 1, 2 }.Mode().ToArray(); //returns { 1, 2 }

我在上面的方法和David B's TakeWhile之间进行了性能测试。

源={ },迭代= 1000000

我的-300ms,David的-930ms来源={1 },迭代= 1000000

我的-1070ms,大卫的-1560ms来源= 100+ int,有2个副本,迭代= 10000

我的-300ms,大卫的-500ms源= 10000个随机整数,大约有100+个副本,迭代= 1000次

我的- 1280毫秒,大卫的- 1400毫秒

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/355945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档