2012-03-14 11 views
8

Tengo una configuración muy simple List<string> que contiene una gran cantidad de caracteres individuales por artículo (es decir, un foreach consolaba a "a" "k" "p", etc.)Lista <string> ¿Grupo simple y recuento?

Lo que me gustaría hacer es poder para agrupar los artículos y también cuentan cuántos de cada uno se produce por lo que tendría una salida similar a:

a - 2 
t - 3 
y - 3 

Algún consejo sobre la mejor manera de hacer esto?

Estoy usando .Net 4 si es de alguna ayuda.

Respuesta

32

(Teniendo en cuenta que cada entrada es un solo carácter, ¿hay alguna razón por la que no tiene una List<char> por cierto?)

¿Qué tal:

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

cuenta que esto es algo ineficaz en términos de representación interna. Definitivamente podría hacerlo de manera más eficiente "manualmente", pero también requeriría más trabajo. A menos que su lista sea grande, me quedaré con esto.

8

La forma más sencilla de hacerlo es utilizando el 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())); 
Cuestiones relacionadas