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