2010-07-13 13 views
5

Vorrei una terza colonna "elementi" con i valori raggruppati.Ottieni valori separati da virgola raggruppati 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(); 

Questo codice si traduce in:

Key Count 
1 2 
2 1 
3 1 

Vorrei questi risultati:

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

risposta

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

Usa string.Join(",", {array}), passando la matrice di chiavi.

+0

se usiamo string.Join, quindi ottenere l'eccezione come Linq alle entità non riconosce la stringa.Modalità Join – reddy39

1

È possibile utilizzare:

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

Il risultato creato da raggruppamento (valore g) ha una prope rty Key che fornisce la chiave, ma implementa anche IEnumerable<T> che consente di accedere ai singoli valori nel gruppo. Se restituisci solo g, puoi eseguire l'iterazione su tutti i valori utilizzando foreach o elaborarli utilizzando LINQ.

Ecco una semplice funzione di discarica per dimostrare questo:

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