您可以使用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);
}
}
[請在此輸入鏈接的描述]試試這個[1 ] [1]:http://stackoverflow.com/questions/4415519/bestw ay-to-remove-duplicate-entries-from-a-data-table –