5

DataTable 行から重複を見つけることができます。次のように:

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

それを行う他の方法はありますか?

編集:ただし、5 つの列のように 2 つ以上の列がある場合でも、Value 列で合計を実行したいのですが、結果の合計されたデータテーブルに他の列のデータも必要です。どうやってするの?ここでは、結果の 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 
4

1 に答える 1

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();
于 2012-10-25T06:42:48.147 に答える