如何找到阵列的模式(最常见的元素)?

时间:2013-11-02 02:29:06

标签: c# .net arrays mode

这是我的阵列:

int myArray = new int[5];

myArray[0] = 1;
myArray[1] = 1;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 5;

如果我希望程序找到这个数组的模式,我该怎么写?

1 个答案:

答案 0 :(得分:8)

这是一个LINQ解决方案:

int mode = myArray
    .GroupBy(x => x)
    .OrderByDescending(g => g.Count())
    .First() // throws InvalidOperationException if myArray is empty
    .Key;

按值对myArray的元素进行分组,按每个组中的值数对组进行排序,并获取第一个组的值。如果有多个模式,那么这将取myArray中首先出现的一个(具有最低索引)。

如果可能有多种模式且您需要所有模式,则可以改为使用此变体:

var groups = myArray
    .GroupBy(x => x)
    .Select(g => new { Value = g.Key, Count = g.Count() })
    .ToList(); // materialize the query to avoid evaluating it twice below
int maxCount = groups.Max(g => g.Count); // throws InvalidOperationException if myArray is empty
IEnumerable<int> modes = groups
    .Where(g => g.Count == maxCount)
    .Select(g => g.Value);

按值对myArray的元素进行分组,查找任意组中的最大值数,并获取具有该最大值数的每个组的值。

如果myArray 非常大,那么第二个版本(即O(n))可能比第一个版本更快(因为O(n log n)排序)。