ID Name Surname Address Tel Company
1 MrCan TomSur blah 011111111 Revolic
2 MrSon SonSur blah blah 022222222 Sanook
3 MrCan TomSur blah 086666666 Sanook
จะเห็นได้ว่า มี MrCan ซ้ำกันอยู่ 2 แถว เราอาจต้องการลบ แถวที่ซ้ำกันนี้ออกไปได้
อันดับเเรก copy text เหล่านี้เเล้วเอาไป Add New Item แล้วเลือกชนิด Class จากนั้นตั้งชื่อว่า IDuplicateDataRows.cs
โค้ด: เลือกทั้งหมด
using System;
using System.Data;
using System.Collections;
namespace Revolic.Utility
{
/// <summary>
/// Summary description for IDuplicateDataRows.
/// </summary>
public class IDuplicateDataRows : IDisposable
{
public IDuplicateDataRows()
{}
#region dispose resources from memory...
private bool disposed = false;
~IDuplicateDataRows()
{
this.Dispose(false);
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
/*dispose managed resources*/
}
/*dispose unmanaged resources*/
this.disposed = true;
}
}
#endregion
#region RemoveDuplicateRows...
public DataTable RemoveDuplicateRows(DataTable tbl, DataColumn[] keyColumns)
{
int rowindex = 0;
while(rowindex < tbl.Rows.Count - 1)
{
DataRow[] duplicaterows = this.FindDuplicateRows(tbl, rowindex, keyColumns);
if(duplicaterows.Length > 0)
{
foreach(DataRow duplicate in duplicaterows)
tbl.Rows.Remove(duplicate);
}
else
rowindex++;
}
DataRow nDr;
DataTable nDt = tbl.Clone();
for(int i = 0; i < tbl.Rows.Count; i++)
{
nDr = nDt.NewRow();
for(int j = 0; j < tbl.Columns.Count; j++)
nDr[j] = tbl.Rows[i][j];
nDt.Rows.Add(nDr);
}
return nDt;
}
#endregion
#region FindDuplicateRows...
private DataRow[] FindDuplicateRows(DataTable tbl, int sourceIndex, DataColumn[] keyColumns)
{
ArrayList retVal = new ArrayList();
DataRow sourceRow = tbl.Rows[sourceIndex];
for(int i = sourceIndex + 1; i < tbl.Rows.Count; i++)
{
DataRow targetRow = tbl.Rows[i];
if(this.IsDuplicateRow(sourceRow, targetRow, keyColumns))
retVal.Add(targetRow);
}
return (DataRow[]) retVal.ToArray(typeof(DataRow));
}
#endregion
#region IsDuplicateRow...
private bool IsDuplicateRow(DataRow sourceRow, DataRow targetRow, DataColumn[] keyColumns)
{
bool retVal = true;
foreach(DataColumn column in keyColumns)
{
retVal = retVal && sourceRow[column].Equals(targetRow[column]);
if(!retVal) break;
}
return retVal;
}
#endregion
}
}
DataTable dt = GetData();
DataColumn[] colName = new DataColumn[1];
colName[0] = dt.Columns["Name"]; //ชื่อคอลัมน์ที่จะนำไปเป็น unique key ในที่นี้คือคอลัมน์ที่ชื่อว่า Name
IDuplicateDataRows util = new IDuplicateDataRows();
dt = util.RemoveDuplicateRows(dt, colName); //found a unique Name which existing on DataTable
dt.AcceptChanges();
//จะได้เเถวที่มีข้อมูล Name ไม่ซ้ำกัน