2011-11-25 82 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])); 
相關問題