繰り返すために共通の比較容器クラスを書き、比較が必要な場所で使用でき、Lamda式をサポートしています.
2379 ワード
繰り返すために、共通の比較容器クラスを書き、比較が必要な場所で使用でき、Lamda式をサポートします.コードは以下の通りです.
次のように呼び出されます.
ここで特に説明する必要がある、GetHashCodeメソッドの書き換えには、:obj.ToString().GetHashCode()は、objを直接使用することはできない.GetHashCode()の理由は次のとおりです(MSDN).
GetHashCode法は派生型で書き換えることができる.GetHashCodeが書き換えていない場合、参照タイプのハッシュコードはベースクラスのObjectを呼び出す.GetHashCodeメソッドは、オブジェクトの参照のハッシュコードに基づいて計算されます.詳細についてはRuntimeHelpersを参照してください.GetHashCode. 言い換えれば、ReferenceEqualsメソッドは、trueの2つのオブジェクトが同じハッシュコードを有することを返す.値タイプがGetHashCodeを書き換えない場合、ベースクラスのValueType.GetHashCode法は,反射を用いてタイプフィールドの値に基づくハッシュコードを計算した.すなわち、フィールドに同じ値を持つ値タイプには、等しいハッシュコードがある.
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の2つのオブジェクトが同じハッシュコードを有することを返す.値タイプがGetHashCodeを書き換えない場合、ベースクラスのValueType.GetHashCode法は,反射を用いてタイプフィールドの値に基づくハッシュコードを計算した.すなわち、フィールドに同じ値を持つ値タイプには、等しいハッシュコードがある.