c# 利用IEqualityComparer接口去除DataTable重複數據

IEqualityComparer主要適用於定義方法以支持對象的相等比較。能夠實現集合的自定義相等比較。即,您能夠建立本身的相等定義,並指定此定義與接受 IEqualityComparer 接口的集合類型一塊兒使用。
IEqualityComparer 接口包含兩個方法
  Equals 肯定指定的對象是否相等。
  GetHashCode 返回指定對象的哈希代碼。
總體來講,比較好理解
Equals方法:自反的、對稱的和可傳遞的。也就是說,若是此方法用於將某個對象與其自身比較,則它將返回 true;
若是對 y 和 x 執行此方法返回 true,則對 x 和 y 這兩個對象也返回 true;
若是對 x 和 y 執行此方法返回 true,而且對 y 和 z 執行此方法也返回 true,則對 x 和 z 這兩個對象也返回 true。
實現須要確保若是對兩個對象 x 和 y 執行 Equals 方法返回 true,則對 x 和 y 分別執行 GetHashCode 方法所返回的值必須相等。
GetHashCode方法:實現須要確保若是對兩個對象 x 和 y 執行 Equals 方法返回 true,則對 x 和 y 分別執行 GetHashCode 方法所返回的值必須相等。
     當咱們用Linq操做咱們自定義的對象時,咱們會發現有些方法直接使用的話根本不起做用,好比:Distinct、Except、Intersect等擴展方法。這是就須要定義IEqualityComparer接口來判斷兩個對象的相等性。數組

 

/// <summary>
        /// 按列名動態對DataTable去除重複數據,選擇出不重複的行
        /// </summary>
        /// <param name="sourceDataTable">數據源</param>
        /// <param name="columnNames">列名數組</param>
        /// <returns>返回sourceDataTable全部的列</returns>
        public DataTable DistinctDataTableByColumn(DataTable sourceDataTable, params string[] columnNames)
        {
         
            if (columnNames == null || columnNames.Length == 0) return sourceDataTable;
            //DataTable dt = null;
            //var rows = sourceDataTable.AsEnumerable().Distinct(new RowComparer(columnNames));
            //if(rows.Any())
            //    return dt = rows.CopyToDataTable();
            //return dt;
            return sourceDataTable.AsEnumerable().Distinct(new RowComparer(columnNames)).CopyToDataTable();
        }   

 class RowComparer : IEqualityComparer<DataRow>
    {
        private string[] _columnNames;
        //public RowComparer() { }
        public RowComparer(string[] columnNames)
        {  
            this._columnNames = columnNames;
        }

        #region IEqualityComparer 成員
        public bool Equals(DataRow r1, DataRow r2)
        {
            return !_columnNames.Any(colName => !r1[colName].Equals(r2[colName]));
            // return r1["FBFBM"].Equals(r2["FBFBM"]);
        }

        public int GetHashCode(DataRow obj)
        {
            return obj.ToString().GetHashCode();
        }
        #endregion
    }

調用:this

DataTable distinctDataTable= DistinctDataTableByColumn(acchelp.GetDataTable(@「select * from cbf」), "CBFBM");spa

過濾前:3d

image

過濾後:code

image

相關文章
相關標籤/搜索