2012-10-25 117 views
5

我能夠從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(); 

現在,我想在合併所有重複的記錄單,總結它的價值列值。

很像如下:

數據表與重複:

Version Value 
1 2 

2 2 

2 1 

1 3 

2 1 

3 2 

DataTable中有沒有重複和值:總結

Version Value 
1 5 

2 4 

3 2 

我知道這個鏈接,與此不反思的幫助。 http://forums.asp.net/t/1570562.aspx/1

其他方式來做到這一點?但是,如果我有兩列以上的列,例如五列,我仍然希望在Value列上執行總計,並且還需要resulatant summed datatable中的其他列數據。怎麼做?在這裏,我在我的結果DataTable中獲得版本和值。我還想要其他具有值的列。就像下面:

版本COL1 COL2價值

1 A A 2 

2 B B 2 

2 B B 1 

1 A A 3 

2 B B 1 

3 C C 2 

回答

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

編輯:

如果你想保留的其他領域,請嘗試以下:

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它是'g.Sum(x => x.Value)'而不是'g.Count'? – Spontifixus

+0

@Spontifixus:你說得對,編輯 –

+0

Right @Spontifixus。我修改它,它是工作。但是,如果我有兩列以上的列,例如五列,並且我仍然希望在Value列上執行總計,並且還需要resulatant summed datatable中的其他列數據。怎麼做?在這裏,我在我的結果DataTable中獲得版本和值。我還想要其他具有值的列。 –