16

List<string>アイテムごとに多くの単一文字を含む非常に単純なセットアップがあります(IE aforeachは「a」「k」「p」などにコンソールアウトします)

私がやりたいのは、アイテムをグループ化し、それぞれの出現数を数えることができるので、次のような出力が得られることです。

a - 2
t - 3
y - 3

これを行うための最良の方法に関するヒントはありますか?

それが助けになるなら、私は.Net 4を使用しています。

4

3 に答える 3

51

(各エントリが 1 文字であることを考えると、ちなみに がない理由はありますList<char>か?)

どうですか:

// To get a Dictionary<string, int>
var counts = list.GroupBy(x => x)
                 .ToDictionary(g => g.Key, g => g.Count());

// To just get a sequence
var counts = list.GroupBy(x => x)
                 .Select(g => new { Text = g.Key, Count = g.Count() });

これは、内部表現の点でやや非効率的であることに注意してください。「手動で」より効率的に行うことは間違いありませんが、より多くの作業が必要になります。あなたのリストが大きくない限り、私はこれに固執します.

于 2012-03-14T13:16:32.257 に答える
9

これを行う最も簡単な方法は、Linq を使用することです。

var list = new[] { "a", "a", "b", "c", "d", "b" };
var grouped = list
    .GroupBy(s => s)
    .Select(g => new { Symbol = g.Key, Count = g.Count() });

foreach (var item in grouped)
{
    var symbol = item.Symbol;
    var count = item.Count;
}
于 2012-03-14T13:19:07.597 に答える
2
var list = new[] {"a", "t", "t", "y", "a", "y", "y", "t"};
var result = (from item in list
              group item by item into itemGroup
              select String.Format("{0} - {1}", itemGroup.Key, itemGroup.Count()));
于 2012-03-14T13:20:24.157 に答える