使用C#查找字符串中出现次数最多的字符?

Cha*_*han 18 c# linq

例如,我有一个字符串:

"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)

笔记:


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)


Alb*_*nbo 9

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)