為了去重復,寫了一個通用的比較容器類,可以用在需要比較的地方,且支持Lamda表達式,代碼如下:
public class DataComparer<T>:IEqualityComparer<T> where T:class { PRivate Func<T, T, bool> _compareFunc; public DataComparer(Func<T,T,bool> compareFunc) { this._compareFunc = compareFunc; } public bool Equals(T x, T y) { return this._compareFunc(x, y); } public int GetHashCode(T obj) { return obj.ToString().GetHashCode(); } }調用如下:
dataTable.AsEnumerable().Distinct(new DataComparer<DataRow>((x, y) => return (x[1] == y[1] && x[2] ==y[2]))).CopyToDataTable();
在這里需要特別說明一下,GetHashCode方法重寫時,需要使用:obj.ToString().GetHashCode(),而不能直接使用obj.GetHashCode(),原因如下(MSDN):
GetHashCode 方法可以由派生類型重寫。 如果 GetHashCode 沒有重寫,引用類型的哈希代碼通過調用基類的 Object.GetHashCode 方法計算,它基于對象的引用的哈希代碼計算;有關更多信息,請參見 RuntimeHelpers.GetHashCode。 換言之,ReferenceEquals 方法返回 true 的兩個對象具有相同的哈希代碼。 如果值類型不重寫 GetHashCode,基類的 ValueType.GetHashCode 方法使用反射計算基于類型字段的值的哈希代碼。 換言之,字段有相同值的值類型有相等的哈希代碼。
新聞熱點
疑難解答