2012-03-14 13 views
8

ho una molto semplice List<string> di installazione che contiene un sacco di singoli caratteri per elemento (IE un foreach consolava fuori per "a" "k" "p", ecc)Lista <string> Semplice Gruppo e il conte?

Quello che mi piacerebbe fare è essere in grado per raggruppare gli elementi e anche contare quante di ogni verifica in modo che avrei avuto un output simile a:

a - 2 
t - 3 
y - 3 

Eventuali suggerimenti sul modo migliore per fare questo?

Sto usando .Net 4 se questo è di aiuto.

risposta

32

(Dato che ogni voce è un singolo carattere, c'è qualche ragione non si dispone di un List<char> a proposito?)

ne dite:

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

notare che questo è un po 'inefficiente in termini di rappresentazione interna. Si potrebbe sicuramente fare in modo più efficiente "manualmente", ma sarebbe anche prendere più lavoro. A meno che la vostra lista è grande, mi attengo a questo.

8

Il modo più semplice per farlo è l'Linq utilizza

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