2012-03-14 12 views
8

Mam bardzo prosty List<string> konfigurację, która zawiera wiele pojedynczych liter w punkcie (tj foreach by pocieszyć się „A”, „k”, „p” itd)Lista <string> Prosta grupa i liczba?

Co chciałbym zrobić, to móc pogrupowanie elementów i policzyć ilu każdy, występuje więc chciałbym uzyskać wynik podobny do:

a - 2 
t - 3 
y - 3 

jakieś wskazówki na temat najlepszego sposobu, aby to zrobić?

Używam .Net 4, jeśli to jest jakaś pomoc.

Odpowiedz

32

(biorąc pod uwagę, że każdy wpis jest pojedynczym znakiem, jest jakiś powód, dla którego nie ma List<char> przy okazji?)

Jak o:

// 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() }); 

pamiętać, że jest nieco nieefektywne pod względem wewnętrznej reprezentacji. Z pewnością można to zrobić bardziej efektywnie "ręcznie", ale wymagałoby to również więcej pracy. Dopóki twoja lista nie jest duża, trzymałbym się tego.

8

Najprostszym sposobem na to jest za pomocą 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; 
} 
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()));