繰り返すために共通の比較容器クラスを書き、比較が必要な場所で使用でき、Lamda式をサポートしています.

2379 ワード

繰り返すために、共通の比較容器クラスを書き、比較が必要な場所で使用でき、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の2つのオブジェクトが同じハッシュコードを有することを返す.値タイプがGetHashCodeを書き換えない場合、ベースクラスのValueType.GetHashCode法は,反射を用いてタイプフィールドの値に基づくハッシュコードを計算した.すなわち、フィールドに同じ値を持つ値タイプには、等しいハッシュコードがある.