2012-12-19 21 views
7

Bu List<object[]>Grubu ve Sum <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 }); 

olst itibaren bu tutmak için yeni bir List<object> üretmek için ihtiyaç var bir listesi: Diğer bir deyişle

"AA1", 3 
"AA2", 2 

, ben gruba gerek olst [x] [0] ve toplamı olst [x] [1].
Bir for döngüsü kullanabilirdim, ancak birisinin bunu başarmak için lambda ifadeleri ve/veya linq kullanmama yardımcı olabileceğini umuyordum.

+1

Nesne dizisi yerine 'Tuple ' kullanmayı düşünebilirsiniz. Veya bu değerleri işlemek için kendi sınıfınızı yazın. Bu sayede güçlü yazarak ve cast yapmaya gerek kalmayacaksınız. – juharr

cevap

6

Kullanım GroupBy ve 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

Bu, aynı birinci değere sahip ikinci değerlerinin toplamına ilk değerden bir sözlük haritalama içine listelemek dönecek.

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

Ben Object[] içeren tip List<Object> olmalıdır sonucunu belirten bölümünü kaçırdım. Downvoters neden hakkında bir yorum bırakacaktı eğer yardımcı olur. ;)