基本的に、特定の文字列で最も頻繁に使用される文字をカウントする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
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]));
に置き換える.First().Key
と.Select(group => group.Key)
、頻度の降順で並べ替えられた文字が返されます。
さて、あなたはすでにそれをほとんど持っています。
input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(x => x.Key).ToArray();
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();