2012-10-25 23 views
5

DataTableの行から重複を見つけることができました。次のように:重複を見つけて単一のデータテーブルにレコードをマージするC#

ここで、すべての重複レコードを1つにマージし、値の列値を合計します。私はこれを行うこのリンクについて承知しています。:

Version Value 
1 5 

2 4 

3 2 

重複なしで

Version Value 
1 2 

2 2 

2 1 

1 3 

2 1 

3 2 

のDataTableと価値合計:重複して

のDataTableを:

かなり多く、次のように反射の助けを借りて http://forums.asp.net/t/1570562.aspx/1

これ以外の方法はありますか?

編集: しかし、私は5列のような3つ以上の列があり、私は依然として値の列に合計を行いたい、また、他の列のデータをresumatant 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.Count'の代わりに' g.Sum(x => x.Value) 'にするのですか? – Spontifixus

+0

@Spontifixus:あなたは正しいです、編集済み –

+0

右@Spontifixus。私はそれを修正し、それは働いています。しかし、私は5つの列のような3つ以上の列を持っている場合、私はまだ値の列に合計を行いたいともresumatant合計datatableで他の列のデータが必要です。どうやってするの?ここでは、結果のDataTableにバージョンと値が表示されます。他の列にも値が必要です。 –

関連する問題