最常出现的元素列表

时间:2017-06-04 18:09:31

标签: c# linq

我有一个列表,让我们说{1,1,2,2,3,3,3,4,4,4}。我想找到最常出现的元素列表(它必须是一个列表,因为可能存在这样的情况,即3和4出现最多,我需要获取该信息。如何使用LINQ实现此目的?

4 个答案:

答案 0 :(得分:3)

var highCountItems = source
  .GroupBy(item => item)
  .GroupBy(g => g.Count(), g => g.Key)
  .OrderByDescending(counts => counts.Key)
  .First();

int theCount = highCountItems.Key;
var theItems = highCountItems.ToList();

答案 1 :(得分:2)

Grouping

var grp = list.GroupBy(i => i).ToList();
int max = grp.Max(c => c.Count());
var most = grp.Where(d => d.Count() == max)
              .Select(c => c.Key).ToList();

答案 2 :(得分:0)

首先,您必须对这些数字进行分组,然后对它们进行排序,这样您就可以获得最常出现的数字。

int[] numbers = { 1, 1, 2, 2, 3, 3, 3, 4, 4, 4 };
var groups = numbers.GroupBy(i => i).OrderByDescending(g => g.Count());

foreach (var group in groups)
{
      // group.Key -> Represents the number in the list
}

groups变量将包含由numbers列表按其出现顺序排列的所有组,这意味着第一组将是发生率最高的组,后面是下一组。在出现相同情况的情况下,将按照列表中的出现对这些组进行排序,例如3& 4具有相同的出现率,而3出现在4之前,因此组的形成顺序相同。

答案 3 :(得分:-1)

有点复杂

var lst_input = new List<int>(new int[] { 1, 1, 2, 2, 3, 3, 3, 4, 4, 4 });
        var result = lst_input.Where(x => lst_input.Max(y => lst_input.Count(z => z == y)) == lst_input.Count(z => z == x)).Distinct().ToList();

但是上面的代码在处理一个非常大的数组时是无效的,因为查找max是为每个元素重新运行的,我们可以首先区分列表。另一种更有效的方法:

var lst_input = new List<int>(new int[] { 1, 1, 2, 2, 3, 3, 3, 4, 4, 4 });
var tmp = lst_input.Distinct();
var max_val = tmp.Max(y => lst_input.Count(z => z == y));
var result = tmp.Where(x => max_val == lst_input.Count(z => z == x)).ToList();