-2

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

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

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

5 回答 5

2

好吧,你几乎已经拥有了。

input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(x => x.Key).ToArray();
于 2011-11-25T17:03:30.823 回答
2

替换.First().Key.Select(group => group.Key)应该返回按频率降序排序的字符。

于 2011-11-25T17:01:09.770 回答
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]));
于 2011-11-25T17:27:52.100 回答
1
input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(group => group.Key).ToArray();
于 2011-11-25T17:01:59.813 回答
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();
于 2011-11-25T17:02:30.377 回答