-2

基本的に、特定の文字列で最も頻繁に使用される文字をカウントするLINQ C#コードの古い部分を見つけました。ただし、頻度分析を使用して、シフト暗号化されたデコードされたテキストを解決しているので、最も人気のある文字だけでなく、出現頻度順に並べられた文字配列を返すようにします。

これが私がここで見つけたLINQコードです:

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

5 に答える 5

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 に答える
2

に置き換える.First().Key.Select(group => group.Key)、頻度の降順で並べ替えられた文字が返されます。

于 2011-11-25T17:01:09.770 に答える
2

さて、あなたはすでにそれをほとんど持っています。

input.GroupBy(x => x).OrderByDescending(x => x.Count()).Select(x => x.Key).ToArray();
于 2011-11-25T17:03:30.823 に答える
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 に答える