本质上,我发现了一段旧的 LINQ C# 代码,它计算了某个字符串中最常见的字母。但是,我正在使用频率分析来解决已被移位加密的解码文本,因此我希望它不仅返回最流行的字符,而且还返回按出现频率排序的字符数组。
这是我在这里找到的 LINQ 代码:
input.GroupBy(x => x).OrderByDescending(x => x.Count()).First().Key
本质上,我发现了一段旧的 LINQ C# 代码,它计算了某个字符串中最常见的字母。但是,我正在使用频率分析来解决已被移位加密的解码文本,因此我希望它不仅返回最流行的字符,而且还返回按出现频率排序的字符数组。
这是我在这里找到的 LINQ 代码:
input.GroupBy(x => x).OrderByDescending(x => x.Count()).First().Key
好吧,你几乎已经拥有了。
input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(x => x.Key).ToArray();
替换.First().Key
为.Select(group => group.Key)
应该返回按频率降序排序的字符。
这是一个不使用LINQ的解决方案,不学习LINQ可能也可以理解:
// count all the frequencies
var frequencies = new Dictionary<char, int>;
foreach(char c in input)
{
if(frequencies.ContainsKey(c))
{
frequencies[c]++;
}
else
{
frequencies.Add(c, 1);
}
}
// Get the characters
var characters = new List<char>(frequencies.Keys);
// Sort them
characters.Sort((x, y) => frequencies[x].CompareTo(frequencies[y]));
input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(group => group.Key).ToArray();
信息都在那里,只是不要把它扔掉:
Dictionary<char, int> count =
input.GroupBy(g => g).ToDictionary(g => g.Key, g => g.Count());
哦,对了,你只想要字符,而不是它们的频率。然后你必须扔掉一些信息:
char[] chars =
input.GroupBy(g => g).OrderByDescending(g => g.Count()).Select(g => g.Key)
.ToArray();