这是我的阵列:
int myArray = new int[5];
myArray[0] = 1;
myArray[1] = 1;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 5;
如果我希望程序找到这个数组的模式,我该怎么写?
答案 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)排序)。