[英]Remove rows with same column value from DataTable and add corresponding values
我有一个包含多列的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();
它删除多余的行,但不累加数量。 因此,请在这方面帮助我。
您可以使用Sum
。 您只需要首先找到重复的行:
var dupGroups = dt.AsEnumerable()
.GroupBy(row => row.Field<int>("ITEM"))
.Where(g => g.Count() > 1);
现在,您可以使用它们来获取总和并从表中删除多余的行。
foreach (var group in dupGroups)
{
DataRow first = group.First();
int sum = group.Sum(r => r.Field<int>("QTY"));
first.SetField("QTY", sum);
foreach (DataRow row in group.Skip(1))
dt.Rows.Remove(row);
}
或在一个查询中创建一个新的DataTable
。
DataTable newTable = dt.AsEnumerable()
.GroupBy(row => row.Field<int>("ITEM"))
.Select(g =>
{
DataRow first = g.First();
if (g.Count() > 1)
{
int sum = g.Sum(r => r.Field<int>("QTY"));
first.SetField("QTY", sum);
}
return first;
})
.CopyToDataTable();
但是,即使第二种方法也修改了原始表,这可能是不希望的,因为您使用CopyToDatatable
来创建新的DataTable
。 您需要克隆原始表( DataTable newTable = dt.Clone();
)以获取具有相同架构的空表。 然后使用NewRow
+ ItemArray.Clone()
或table.ImportRow
创建一个真实的副本,而无需修改原始数据。
请参阅: C#复制或克隆DataRow的简单方法?
编辑 :这是一个示例,您可以在不触摸原始表的情况下创建克隆:
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);
}
}
var table = dt.AsEnumerable()
.GroupBy(row => row.Field<int>("ITEM"))
.Select(group => {
var row = group.First();
row['QTY'] = group.Sum(x => x.Field<int>('QTY'));
return row;
}).CopyToDataTable();
这不会更改您原来的DataTable
:
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.