2012-12-19 10 views
7

ho questo List<object[]>Group e Sum un elenco <object[]>

List<object[]> olst = new List<object[]>(); 

olst.Add(new object[] { "AA1", 1 }); 
olst.Add(new object[] { "AA2", 1 }); 
olst.Add(new object[] { "AA2", 1 }); 
olst.Add(new object[] { "AA1", 1 }); 
olst.Add(new object[] { "AA1", 1 }); 

Da olst, ho bisogno di produrre un nuovo List<object> per contenere questo:

"AA1", 3 
"AA2", 2 

In altre parole, ho bisogno di gruppo olst [x] [0] e somma olst [x] [1].
Potrei usare un ciclo for, ma speravo che qualcuno potesse aiutarmi a usare espressioni lambda e/o linq per realizzare questo.

+1

Si potrebbe voler considerare l'uso di 'Tuple ' invece di un array di oggetti. O scrivi la tua classe per gestire questi valori. In questo modo avrai una forte digitazione e non dovrai fare cast. – juharr

risposta

6

Usa GroupBy e Select:

List<object[]> newList = olst 
    /* Group the list by the element at position 0 in each item */ 
    .GroupBy(o => o[0].ToString()) 
    /* Project the created grouping into a new object[]: */ 
    .Select(i => new object[] 
    { 
     i.Key, 
     i.Sum(x => (int)x[1]) 
    }) 
    .ToList(); 
1

Questo si trasformerà vi elenco in una mappatura dizionario dal primo valore alla somma dei secondi valori con lo stesso primo valore.

var result = olst.GroupBy(entry => (String)entry[0]) 
       .Select(group => new Object[] 
            { 
             group.Key, 
             group.Sum(item => (Int32)item[1]) 
            }) 
       .ToList(); 

ho perso la parte che indica il risultato dovrebbe essere di tipo List<Object> contenente Object[]. Sarebbe utile se i downvoters avessero lasciato un commento sul perché. ;)