Sar*_*ara 1 c# linq datatable dataset linq-to-dataset
我有一个包含多列的DataTable.如果某些列的值重复,我需要删除该行并对其添加数量.例如,跟随数据表
ITEM QTY
------------
1 20
2 10
2 10
3 20
Run Code Online (Sandbox Code Playgroud)
会成为:
ITEM QTY
-----------
1 20
2 20
3 20
Run Code Online (Sandbox Code Playgroud)
这就是我做的
var table = dt.AsEnumerable()
.GroupBy(row => row.Field("ITEM"))
.Select(group => group.First())
.CopyToDataTable();
Run Code Online (Sandbox Code Playgroud)
它删除了额外的行但不添加数量.所以请在这方面帮助我.
你可以用Sum.你必须先找到重复行:
var dupGroups = dt.AsEnumerable()
.GroupBy(row => row.Field<int>("ITEM"))
.Where(g => g.Count() > 1);
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用它们来获取总和并从表中删除冗余行.
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);
}
Run Code Online (Sandbox Code Playgroud)
或者在一个创建新的查询中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();
Run Code Online (Sandbox Code Playgroud)
但是,即使是第二种方法也会修改原始表,因为您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);
}
}
Run Code Online (Sandbox Code Playgroud)