web-dev-qa-db-ja.com

List <string>単純なグループとカウント?

私は非常に単純なList<string>アイテムごとに多数の単一文字を含むセットアップ(つまり、foreachは "a" "k" "p"などにコンソールアウトします)

私がやりたいのは、アイテムをグループ化し、それぞれの発生数をカウントできるようにすることです。これにより、次のような出力が得られます。

a - 2
t - 3
y - 3

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

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

13
tripbrock

(各エントリが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() });

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

42
Jon Skeet

これを行う最も簡単な方法は、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;
}
9
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()));
2
Scroog1