2010-07-13 27 views
5

Me gustaría una tercera columna "artículos" con los valores que están agrupados.Obtener valores separados por comas agrupados con linq

Dictionary<string, int> dic = new Dictionary<string, int>(); 
dic.Add("a", 1); 
dic.Add("b", 1); 
dic.Add("c", 2); 
dic.Add("d", 3); 

var dCounts = 
    (from i in dic 
    group i by i.Value into g 
    select new { g.Key, count = g.Count()}); 

    var a = dCounts.Where(c => c.count>1); 

dCounts.Dump(); 
a.Dump(); 

Este código da como resultado:

Key Count 
1 2 
2 1 
3 1 

me gustaría estos resultados:

Key Count Items 
1 2  a, b 
2 1  c 
3 1  d 

Respuesta

8
var dCounts = 
     (from i in dic 
      group i by i.Value into g 
      select new { g.Key, count = g.Count(), Items = string.Join(",", g.Select(kvp => kvp.Key)) }); 

Uso string.Join(",", {array}), pasando en su matriz de claves.

+0

si usamos string.Join, a continuación, obteniendo una excepción como Linq a las entidades no reconoce la cadena.Método de unión – reddy39

1

que puede utilizar:

var dCounts = 
    from i in dic 
    group i by i.Value into g 
    select new { g.Key, Count = g.Count(), Values = g }; 

El resultado creado por la agrupación (valor g) tiene un prope rty Key que le proporciona la clave, pero también implementa IEnumerable<T> que le permite acceder a valores individuales en el grupo. Si devuelve solo g, puede recorrer todos los valores usando foreach o procesarlos usando LINQ.

Aquí es una simple función de volcado para demostrar esto:

foreach(var el in dCounts) { 
    Console.Write(" - {0}, count: {1}, values:", el.Key, el.Count); 
    foreach(var item in el.Values) Console.Write("{0}, ", item); 
| 
0
from i in dic 
group i.Key by i.Value into g 
select new 
{ 
    g.Key, 
    count = g.Count(), 
    items = string.Join(",", g.ToArray()) 
}); 
Cuestiones relacionadas