本質上,我發現了一段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