是否可以根据字符串中的字符频率创建数组?

时间:2011-11-25 16:58:38

标签: c# string linq frequency-analysis

基本上,我发现了一段旧的LINQ C#代码,它计算了某个字符串中最常用的字母。但是,我正在使用频率分析来解决已经移位加密的已解码文本,因此我希望它不仅返回最受欢迎的字符,而且返回按出现频率排序的字符数组。

这是我在这里找到的LINQ代码:

input.GroupBy(x => x).OrderByDescending(x => x.Count()).First().Key

5 个答案:

答案 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();