例如,我有一个字符串:
"abbbbccd"
Run Code Online (Sandbox Code Playgroud)
b发生次数最多.使用C++时,处理此问题的最简单方法是将每个字符插入到map<>.我是否必须在C#中做同样的事情?使用LINQ有一种优雅的方式吗?
Fem*_*ref 29
input.GroupBy(x => x).OrderByDescending(x => x.Count()).First().Key
Run Code Online (Sandbox Code Playgroud)
笔记:
"aaaabbbb"只有其中一个的情况将被退回(感谢 xanatos评论).如果您需要所有具有最大计数的元素,请使用Albin的解决方案.xan*_*tos 11
这是因为有人要求提供2.0版本,所以没有LINQ.
Dictionary<char, int> dict = new Dictionary<char, int>();
int max = 0;
foreach (char c in "abbbbccccd")
{
int i;
dict.TryGetValue(c, out i);
i++;
if (i > max)
{
max = i;
}
dict[c] = i;
}
foreach (KeyValuePair<char, int> chars in dict)
{
if (chars.Value == max)
{
Console.WriteLine("{0}: {1}", chars.Key, chars.Value);
}
}
Run Code Online (Sandbox Code Playgroud)
相反,这适用于LINQ版本.它将提取成对的"bests"(aaaabbbb == a,b).如果str == String.Empty,它将无法工作.
var str = "abbbbccccd";
var res = str.GroupBy(p => p).Select(p => new { Count = p.Count(), Char = p.Key }).GroupBy(p => p.Count, p => p.Char).OrderByDescending(p => p.Key).First();
foreach (var r in res) {
Console.WriteLine("{0}: {1}", res.Key, r);
}
Run Code Online (Sandbox Code Playgroud)
string testString = "abbbbccd";
var charGroups = (from c in testString
group c by c into g
select new
{
c = g.Key,
count = g.Count(),
}).OrderByDescending(c => c.count);
foreach (var group in charGroups)
{
Console.WriteLine(group.c + ": " + group.count);
}
Run Code Online (Sandbox Code Playgroud)