2012-12-19 18 views
7

mam to List<object[]>Group i Sum List <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 }); 

Od olst muszę produkować nową List<object> trzymać to:

"AA1", 3 
"AA2", 2 

Innymi słowy, muszę grupy olst [x] [0] i podsumowanie olst [x] [1].
Mogłem użyć pętli for, ale miałem nadzieję, że ktoś może mi pomóc, używając wyrażeń lambda i/lub linq, aby to osiągnąć.

+1

Możesz rozważyć użycie 'Tuple ' zamiast tablicy obiektów. Lub napisz własną klasę, aby obsłużyć te wartości. W ten sposób będziesz mieć silne pisanie i nie będziesz musiał wykonywać rzutów. – juharr

Odpowiedz

6

Zastosowanie GroupBy i 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

ten okaże Ci listy do słownika mapowania od pierwszej wartości sumy drugich wartości z tej samej pierwszej wartości.

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

Tęskniłem część podający wynik powinien być typu List<Object> zawierającej Object[]. Pomogłoby to, gdyby spadkowcy zostawili komentarz na temat tego, dlaczego. ;)