C# Remove row ซ้ำๆใน DataTable ออกไป (remove duplicate datarows)

แนะนำ สอบถาม ภาษา C สำหรับผู้เริ่มต้น ภาษา Java ภาษา Python

Moderators: mindphp, ผู้ดูแลกระดาน

User avatar
jataz2
PHP Super Member
PHP Super Member
Posts: 242
Joined: 22/02/2011 11:48 am

C# Remove row ซ้ำๆใน DataTable ออกไป (remove duplicate datarows)

Post by jataz2 »

ถ้าข้อมูลที่เรา คิวรีออกมา มีบางแถวที่มีค่าซ้ำกันเช่น

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

Code: Select all

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 ไม่ซ้ำกัน

  • Similar Topics
    Replies
    Views
    Last post

Return to “Programming - C/C++ & java & Python”

Who is online

Users browsing this forum: No registered users and 8 guests