. 당신은 먼저 중복-행을 찾을 수있다 :
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();
은 그러나, 두 번째 방법은 새
DataTable
을 만들
CopyToDatatable
을 사용하기 때문에 바람직하지 않은 될 수있는 원래의 테이블을 수정합니다. 같은 스키마를 가진 빈 테이블을 얻으려면 원래 테이블 (
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 –