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
過濾後:code