基本上,我发现了一段旧的LINQ C#代码,它计算了某个字符串中最常用的字母。但是,我正在使用频率分析来解决已经移位加密的已解码文本,因此我希望它不仅返回最受欢迎的字符,而且返回按出现频率排序的字符数组。
这是我在这里找到的LINQ代码:
input.GroupBy(x => x).OrderByDescending(x => x.Count()).First().Key
答案 0 :(得分:2)
用.First().Key
替换.Select(group => group.Key)
应该按降序排列按频率排序的字符。
答案 1 :(得分:2)
嗯,你已经拥有它了。
input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(x => x.Key).ToArray();
答案 2 :(得分:2)
这是一个没有使用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]));
答案 3 :(得分:1)
input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(group => group.Key).ToArray();
答案 4 :(得分:1)
信息就在那里,不要扔掉它:
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();