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