2011-11-25 56 views
-2

本质上,我发现了一段LINQ C#代码,它计算了某个字符串中最频繁的字母。然而,我正在使用频率分析来解决已经移位加密的解码文本,所以我希望它不仅返回最流行的字符,而且还返回按外观频率排序的字符数组。是否可以根据字符串中字符的频率创建数组?

这里是LINQ代码,我发现在这里:

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

拜托,这是一个“做我的工作,为我”的问题?我建议你去学习LINQ,并理解那段代码的作用。 **谁对此赞同?** –

+0

你想要什么?你想知道这个代码是否好?或者你想要一个优化版本? – Aamir

+0

相信我R.马蒂尼奥费尔南德斯,我已经退出了一段时间的循环,从来没有使用过LINQ,我已经竭尽全力去研究如何做到这一点。以为我可以在这里获得帮助 – samil90

回答

2

好吧,你已经很多了。

input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(x => x.Key).ToArray(); 
+0

精彩,谢谢! – samil90

2

更换.First().Key.Select(group => group.Key)应该返回给你的频率降序排列的字符。

1
input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(group => group.Key).ToArray(); 
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(); 
+0

也将使用这个,非常感谢! – samil90

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])); 
相关问题