在List <int>中查找最常出现的数字

25 c# linq list

有没有使用linq的快速和好的方式?

Mar*_*ell 71

怎么样:

var most = list.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
      .Select(grp=>grp.Key).First();
Run Code Online (Sandbox Code Playgroud)

或者在查询语法中:

var most = (from i in list
            group i by i into grp
            orderby grp.Count() descending
            select grp.Key).First();
Run Code Online (Sandbox Code Playgroud)

当然,如果你反复使用它,你可以添加一个扩展方法:

public static T MostCommon<T>(this IEnumerable<T> list)
{
    return ... // previous code
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

var most = list.MostCommon();
Run Code Online (Sandbox Code Playgroud)

  • 如果答案不止一个元素怎么办? (5认同)
  • 原生LINQ的最佳解决方案.虽然使用[MoreLINQ](http://morelinq.googlecode.com/)的`MaxBy()`你甚至可以执行以下操作:`list.GroupBy(i => i).MaxBy(g => g.Count ()).Key`.除了更短更清晰之外,理论上它对于大型数据集(最大与排序)应该更有效. (2认同)

Mik*_*vey 5

不确定 lambda 表达式,但我会

  1. 对列表进行排序 [O(n log n)]

  2. 扫描列表 [O(n)] 找到最长的游程长度。

  3. 再次扫描 [O(n)] 报告每个具有该游程长度的数字。

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