-2

私は次のような文字列を持っています:

string str = "ssmmmjjkkkkrrr"

C#を使用して、個々の文字の数を次のように表示する必要があります。

 s = 2
 m = 3
 j = 2
 k = 4
 r = 3

前もって感謝します。

4

4 に答える 4

19

最も簡単な方法は、LINQ を使用することです。

var counted = text.GroupBy(c => c)
                  .Select(g => new { g.Key, Count = g.Count() });

foreach (var result in counted)
{
    Console.WriteLine("{0} = {1}", result.Key, result.Count);
}

またはもっと簡単に:

foreach (var group in text.GroupBy(c => c))
{
    Console.WriteLine("{0} = {1}", group.Key, result.Count());
}
于 2012-05-31T08:49:15.387 に答える
5
string str = "ssmmmjjkkkkrrr";
var counts = str.GroupBy(c => c).Select(g => new { Char = g.Key, Count = g.Count() });

foreach(var c in counts)
{
    Console.WriteLine("{0} = {1}", c.Char, c.Count);
}
于 2012-05-31T08:49:32.080 に答える
4

誰もが linq ソリューションを配置しているので、同じ結果を達成するための簡単なコード方法を提供します (おそらくはるかに高速です)。

 string str = "ssmmmjjkkkkrrr";
  Dictionary<char, int> counts = new Dictionary<char, int>();

  for (int i = 0; i < str.Length; i++)
       if (counts.ContainsKey(str[i]))
         counts[str[i]]++;
       else
         counts.Add(str[i], 1);

  foreach (var count in counts)
       Debug.WriteLine("{0} = {1}", count.Key, count.Value.ToString());

EDIT 以下のパフォーマンス コメントに応えて、これを少し速くしようとします。これは汚いコードですが、かなり速く実行されます。

ディクショナリ メソッドは、ディクショナリがストレージを割り当てる方法に悩まされます。割り当てられたストレージのしきい値を超えるアイテムを追加するたびに、使用可能なストレージが 2 倍になります (新しいサイズで新しい配列を割り当て、すべての要素をコピーします)。これには時間がかかります。このソリューションはそれを回避します。

// we know how many values can be in char.
int[] values = new int[char.MaxValue];

// do the counts.
for (int i = 0; i < text.Length; i++)
    values[text[i]]++;

// Display the results.
for (char i = char.MinValue; i < char.MaxValue; i++)
    if (values[i] > 0)
       Debug.WriteLine("{0} = {1}", i, values[i]);
于 2012-05-31T09:03:02.603 に答える
1
mystring.GroupBy(ch => ch)
        .Select(a => new { ch = a.Key, count = a.Count() })
        .ToList()
        .ForEach(x => Console.WriteLine("{0} = {1}", x.ch, x.count));
于 2012-05-31T08:56:22.510 に答える