本质上,我发现了一段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();
精彩,谢谢! – samil90
更换.First().Key
与.Select(group => group.Key)
应该返回给你的频率降序排列的字符。
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();
也将使用这个,非常感谢! – samil90
这里有一个解决方案,不使用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]));
拜托,这是一个“做我的工作,为我”的问题?我建议你去学习LINQ,并理解那段代码的作用。 **谁对此赞同?** –
你想要什么?你想知道这个代码是否好?或者你想要一个优化版本? – Aamir
相信我R.马蒂尼奥费尔南德斯,我已经退出了一段时间的循环,从来没有使用过LINQ,我已经竭尽全力去研究如何做到这一点。以为我可以在这里获得帮助 – samil90