查找重复并将记录合并到单个数据表c#中

时间:2012-10-25 06:33:08

标签: c# linq datatable group-by sum

我能够从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();

现在,我想将所有重复记录合并为单个,并将其与值列值相加。

非常像以下内容:

具有重复项的DataTable:

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中获得了Version和Value。我也希望其他列具有值。如下:

版本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 

1 个答案:

答案 0 :(得分: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();