如何获得Int数组中最常见的值? (C#)

如何使用C#获取Int数组中最常见的值

例如:Array具有以下值:1,1,1,2

Ans应为1

 var query = (from item in array group item by item into g orderby g.Count() descending select new { Item = g.Key, Count = g.Count() }).First(); 

对于价值而不是数量,你可以做到

 var query = (from item in array group item by item into g orderby g.Count() descending select g.Key).First(); 

第二个Lambda版本:

 var query = array.GroupBy(item => item).OrderByDescending(g => g.Count()).Select(g => g.Key).First(); 

一些老式的高效循环:

 var cnt = new Dictionary(); foreach (int value in theArray) { if (cnt.ContainsKey(value)) { cnt[value]++; } else { cnt.Add(value, 1); } } int mostCommonValue = 0; int highestCount = 0; foreach (KeyValuePair pair in cnt) { if (pair.Value > highestCount) { mostCommonValue = pair.Key; highestCount = pair.Value; } } 

现在, mostCommonValue包含最常见的值,而highestCount包含它发生的次数。

也许是O(n log n),但很快:

 sort the array a[n] // assuming n > 0 int iBest = -1; // index of first number in most popular subset int nBest = -1; // popularity of most popular number // for each subset of numbers for(int i = 0; i < n; ){ int ii = i; // ii = index of first number in subset int nn = 0; // nn = count of numbers in subset // for each number in subset, count it for (; i < n && a[i]==a[ii]; i++, nn++ ){} // if the subset has more numbers than the best so far // remember it as the new best if (nBest < nn){nBest = nn; iBest = ii;} } // print the most popular value and how popular it is print a[iBest], nBest 
  public static int get_occure(int[] a) { int[] arr = a; int c = 1, maxcount = 1, maxvalue = 0; int result = 0; for (int i = 0; i < arr.Length; i++) { maxvalue = arr[i]; for (int j = 0; j  maxcount) { maxcount = c; result = arr[i]; } } else { c=1; } } } return result; } 

我知道这篇文章很老了,但今天有人问我这个问题的反面。

LINQ分组

 sourceArray.GroupBy(value => value).OrderByDescending(group => group.Count()).First().First(); 

Temp Collection,类似于Guffa的:

 var counts = new Dictionary(); foreach (var i in sourceArray) { if (!counts.ContainsKey(i)) { counts.Add(i, 0); } counts[i]++; } return counts.OrderByDescending(kv => kv.Value).First().Key; 

linq的另一个解决方案:

 static int[] GetMostCommonIntegers(int[] nums) { return nums .ToLookup(n => n) .ToLookup(l => l.Count(), l => l.Key) .OrderBy(l => l.Key) .Last() .ToArray(); } 

当多个数字具有相同数量的出现时,此解决方案可以处理这种情况:

 [1,4,5,7,1] => [1] [1,1,2,2,3,4,5] => [1,2] [6,6,6,2,2,1] => [6]