Вы можете использовать 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/best-w ay-to-remove-duplicate-entries-from-a-data-table –