C# 从DataTable中删除具有相同列值的行并添加相应的值

C# 从DataTable中删除具有相同列值的行并添加相应的值,c#,linq,datatable,dataset,linq-to-dataset,C#,Linq,Datatable,Dataset,Linq To Dataset,我有一个多列的数据表。如果某个列的值重复,我需要删除该行,并针对该行添加数量。例如,下面的datatable ITEM QTY ------------ 1 20 2 10 2 10 3 20 将成为: ITEM QTY ----------- 1 20 2 20 3 20 这就是我所做的 var table = dt.AsEnumerable() .GroupBy(row => row.

我有一个多列的数据表。如果某个列的值重复,我需要删除该行,并针对该行添加数量。例如,下面的datatable

ITEM    QTY
------------
1       20
2       10
2       10
3       20
将成为:

ITEM    QTY
-----------
1       20
2       20
3       20
这就是我所做的

var table = dt.AsEnumerable() 
.GroupBy(row => row.Field("ITEM")) 
.Select(group => group.First()) 
.CopyToDataTable();

它会删除额外的行,但不会将数量相加。因此,请在这方面帮助我。

这不会改变您原来的
数据表

var table = dt.Copy().AsEnumerable()
                      .GroupBy(row=>row["ITEM"])
                      .Select(g=> {
                                DataRow dr = g.First();
                                dr.SetField("QTY", g.Sum(x=>x.Field<int>("QTY")));
                                return dr;
                             })
                      .CopyToDataTable();
var table=dt.Copy().AsEnumerable()
.GroupBy(行=>行[“项”])
.选择(g=>{
DataRow dr=g.First();
dr.SetField(“数量”,g.Sum(x=>x.Field(“数量”));
返回dr;
})
.CopyToDataTable();

这不会更改原始的
数据表

var table = dt.Copy().AsEnumerable()
                      .GroupBy(row=>row["ITEM"])
                      .Select(g=> {
                                DataRow dr = g.First();
                                dr.SetField("QTY", g.Sum(x=>x.Field<int>("QTY")));
                                return dr;
                             })
                      .CopyToDataTable();
var table=dt.Copy().AsEnumerable()
.GroupBy(行=>行[“项”])
.选择(g=>{
DataRow dr=g.First();
dr.SetField(“数量”,g.Sum(x=>x.Field(“数量”));
返回dr;
})
.CopyToDataTable();

您可以使用
Sum
。您只需首先找到重复的行:

var dupGroups = dt.AsEnumerable()
    .GroupBy(row => row.Field<int>("ITEM"))
    .Where(g => g.Count() > 1);
但是,即使是第二种方法也会修改原始表,这可能是不需要的,因为您使用
CopyToDatatable
来创建新的
DataTable
。您需要克隆原始表(
DataTable newTable=dt.clone();
)以获得具有相同架构的空表。然后使用
NewRow
+
ItemArray.Clone()
table.ImportRow
创建真正的克隆,而不修改原始数据

见:

编辑:下面是一个示例,说明如何在不接触原始表的情况下创建克隆:

DataTable newTable = dt.Clone();
var itemGroups = dt.AsEnumerable()
    .GroupBy(row => row.Field<int>("ITEM"));
foreach (var group in itemGroups)
{
    DataRow first = group.First();
    if (group.Count() == 1)
        newTable.ImportRow(first);
    else
    {
        DataRow clone = newTable.Rows.Add((object[])first.ItemArray.Clone());
        int qtySum = group.Sum(r => r.Field<int>("QTY"));
        clone.SetField("QTY", qtySum);
    }
}
DataTable newTable=dt.Clone();
var itemGroups=dt.AsEnumerable()
.GroupBy(行=>行字段(“项”);
foreach(项目组中的var组)
{
DataRow first=group.first();
if(group.Count()==1)
newTable.ImportRow(第一);
其他的
{
DataRow clone=newTable.Rows.Add((对象[])first.ItemArray.clone());
int qtySum=group.Sum(r=>r.Field(“数量”);
克隆设置字段(“数量”,qtySum);
}
}

您可以使用
Sum
。您只需首先找到重复的行:

var dupGroups = dt.AsEnumerable()
    .GroupBy(row => row.Field<int>("ITEM"))
    .Where(g => g.Count() > 1);
但是,即使是第二种方法也会修改原始表,这可能是不需要的,因为您使用
CopyToDatatable
来创建新的
DataTable
。您需要克隆原始表(
DataTable newTable=dt.clone();
)以获得具有相同架构的空表。然后使用
NewRow
+
ItemArray.Clone()
table.ImportRow
创建真正的克隆,而不修改原始数据

见:

编辑:下面是一个示例,说明如何在不接触原始表的情况下创建克隆:

DataTable newTable = dt.Clone();
var itemGroups = dt.AsEnumerable()
    .GroupBy(row => row.Field<int>("ITEM"));
foreach (var group in itemGroups)
{
    DataRow first = group.First();
    if (group.Count() == 1)
        newTable.ImportRow(first);
    else
    {
        DataRow clone = newTable.Rows.Add((object[])first.ItemArray.Clone());
        int qtySum = group.Sum(r => r.Field<int>("QTY"));
        clone.SetField("QTY", qtySum);
    }
}
DataTable newTable=dt.Clone();
var itemGroups=dt.AsEnumerable()
.GroupBy(行=>行字段(“项”);
foreach(项目组中的var组)
{
DataRow first=group.first();
if(group.Count()==1)
newTable.ImportRow(第一);
其他的
{
DataRow clone=newTable.Rows.Add((对象[])first.ItemArray.clone());
int qtySum=group.Sum(r=>r.Field(“数量”);
克隆设置字段(“数量”,qtySum);
}
}
var table=dt.AsEnumerable()
.GroupBy(行=>行字段(“项”))
.选择(组=>{
var row=group.First();
行['QTY']=组和(x=>x.Field('QTY');
返回行;
}).CopyToDataTable();
var table=dt.AsEnumerable()
.GroupBy(行=>行字段(“项”))
.选择(组=>{
var row=group.First();
行['QTY']=组和(x=>x.Field('QTY');
返回行;
}).CopyToDataTable();

试试这个[在这里输入链接描述][1][1]:试试这个[在这里输入链接描述][1][1]:你也不用
dr
anywhere@musefan谢谢,我不知道为什么打错了。这将是
dr
。您也不使用
dr
anywhere@musefan谢谢,我不知道为什么打错了。这将是
dr
。但是,这会修改原始表,这可能是不需要的,因为OP使用
CopyToDatatable
创建新的
DataTable
。顺便说一句,同样的问题也出现了。您需要克隆原始表,并使用
NewRow
+
ItemArray.clone()
table.ImportRow
在不修改原始数据的情况下创建真正的克隆。@Cuong Le谢谢。它起作用了。它修改了原始表,但这是一个小问题。但是,这会修改原始表,这可能是不需要的,因为OP使用
CopyToDatatable
创建新的
DataTable
。顺便说一句,同样的问题也出现了。您需要克隆原始表,并使用
NewRow
+
ItemArray.clone()
table.ImportRow
在不修改原始数据的情况下创建真正的克隆。@Cuong Le谢谢。它起作用了。它修改了原文,但这是个小问题。谢谢你的回答和评论。第二种方法是有帮助的。@Sara:但是第二种方法是最“危险的”,因为它以一种微妙的方式修改了两个表。如果我不想创建一个新表,我会使用第一个表;如果我想创建一个包含求和值的复制表,我会使用
table.Clone()
+
ImportRow
。@Sara:添加了一个示例(未测试),演示如何在不修改原始表的情况下创建一个包含总计数据的克隆。谢谢您的努力。我使用了你的第二种方法并进行了测试。在我看来,原来的桌子还是一样的。至少行数保持不变。我不明白原始表格被修改的微妙方式。@Sara:t