2012-10-25 18 views
5

Jestem w stanie znaleźć duplikaty z wierszy DataTable. Jak następuje:Znajdź duplikat i scal rekord w jeden datatable C#

var groups = table.AsEnumerable() 
     .GroupBy(r => new 
     { 
      c1 = r.Field<String>("Version"), 
     }); 
     var tblDuplicates = groups 
      .Where(grp => grp.Count() > 1) 
      .SelectMany(grp => grp) 
      .CopyToDataTable(); 

Teraz chcę scalić wszystkie duplikaty rekordów w celu jedno- i podsumować to wartość kolumny Wartość.

Prawie jak następuje:

DataTable z duplikaty:

Version Value 
1 2 

2 2 

2 1 

1 3 

2 1 

3 2 

DataTable bez duplikatów i wartość sumuje .:

Version Value 
1 5 

2 4 

3 2 

Jestem świadomy o tym linkiem, który robi to z pomoc refleksji. http://forums.asp.net/t/1570562.aspx/1

Inna metoda na zrobienie tego?

Edycja: Edycja: Jednak, jeśli mam więcej niż dwie kolumny, takich jak pięć kolumn i nadal chcę zrobić sumę w kolumnie wartości, a także potrzebują innych kolumn danych w podsumowaniu datowalne resulatant. Jak to zrobić? Tutaj otrzymuję wersję i wartość w moim wyniku DataTable. Chcę również inne kolumny z wartościami. Jak następuje:

Wersja Col1 COL2 Wartość

1 A A 2 

2 B B 2 

2 B B 1 

1 A A 3 

2 B B 1 

3 C C 2 

Odpowiedz

6
var result = table.AsEnumerable() 
      .GroupBy(r => r.Field<string>("Version")) 
      .Select(g => 
       { 
        var row = table.NewRow(); 
        row.ItemArray = new object[] 
         { 
          g.Key, 
          g.Sum(r => r.Field<int>("Value")) 
         }; 
        return row; 
       }).CopyToDataTable(); 

Edit:

Jeśli chcesz zachować innej dziedzinie, spróbuj poniżej:

var result = table.AsEnumerable() 
      .GroupBy(r => new 
       { 
        Version = r.Field<String>("Version"), 
        Col1 = r.Field<String>("Col1"), 
        Col2 = r.Field<String>("Col2") 
       }) 
      .Select(g => 
       { 
        var row = g.First(); 
        row.SetField("Value", g.Sum(r => r.Field<int>("Value"))); 
        return row; 
       }).CopyToDataTable(); 
+0

should't go być 'g.Sum (x => x.Value)' zamiast 'g.Count'? – Spontifixus

+0

@ Spontifixus: masz rację, edytuj –

+0

Right @Spontifixus. Zmodyfikowałem go i działa. Jednakże, jeśli mam więcej niż dwie kolumny, takie jak pięć kolumn i nadal chcę wykonać sumę w kolumnie Wartość, a także potrzebne są inne dane kolumn w podsumowujących zbiorczych datowalnych. Jak to zrobić? Tutaj otrzymuję wersję i wartość w moim wyniku DataTable. Chcę również inne kolumny z wartościami. –

Powiązane problemy