gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:53 28 4
gpt4 key购买 nike

我有一个包含多列的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# simple way to copy or clone a 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);
}
}

关于c# - 从DataTable中删除具有相同列值的行并添加相应的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18463088/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com