Dom*_*aza 4 c# linq arrays string
我有这个问题.有一个字符串
string [5] names = { "John", "Sam", "Harry", "Sam", "John" }
Run Code Online (Sandbox Code Playgroud)
我需要找到数组中最常见的元素.我试过用:
string MostCommon = names.GroupBy(v => v)
.OrderByDescending(g => g.Count())
.First()
.Key;
Run Code Online (Sandbox Code Playgroud)
不幸的是,它只找到一个元素fe,MostCommon = John在这种情况下我不仅需要John,而且Sam也需要.我怎么能这样做?在这种情况下,LINQ不是必需的吗?
Him*_*ere 10
First显然只会选择序列的第一个元素.但是,您需要具有相同编号的所有组.所以,选择每个组和秩序的姓名和电话号码之后.最后选择与第一组具有相同计数的所有组.
var groups = names.GroupBy(x => x)
.Select(x => new { x.Key, Count = x.Count() })
.OrderByDescending(x => x.Count);
int max = groups.First().Count;
var mostCommons = groups.Where(x => x.Count == max);
Run Code Online (Sandbox Code Playgroud)
编辑:您也可以使用TakeWhile而不是Where在最后一个语句中,这将避免对groups-list中的最后一个元素进行不必要的比较,并在发现第一个组元素少于第一个元素时立即停止:
var mostCommons = groups.TakeWhile(x => x.Count == groups.First().Count);
Run Code Online (Sandbox Code Playgroud)
这可以按如下方式进行 -
var nameGroup = names.GroupBy(x => x);
var maxCount = nameGroup.Max(g => g.Count());
var mostCommons = nameGroup.Where(x => x.Count() == maxCount).Select(x => x.Key).ToArray();
Run Code Online (Sandbox Code Playgroud)