2011-10-13 9 views
6

'Equal'メソッドと 'GetHashcode'メソッドがオブジェクトクラスに存在し、その型はオブジェクト基本クラスを継承します。 オブジェクトの2つのメソッドを直接実装し、IComparerインターフェイスを使用する方法の違いは何ですか?IEqualityComparerが必要な理由IEqualityComparer <T>インターフェイス?

オブジェクトのEqualとGetHashCodeをオーバーライドしてハッシュテーブルにプッシュすると、オーバーリングの等価メソッドが使用されますか?

IEqualityComparerコンストラクタで新しいハッシュテーブルの違いは何ですか?

答えて

14

IComparableインターフェイスは、オブジェクトを「並べ替える」必要がある場合に使用され、2つのオブジェクトが<、=または>であるかどうかを示す方法(CompareTo)を示します。 IEqualityComparerを使用するコンストラクタでは、オブジェクトによって定義されたものと異なる場合がある特定のEquals/GetHashCodeを指定できます。通常Hashtableは、オブジェクトEqualsGetHashCode(またはベースobjectEqualsGetHashCode)をオーバーライドしたオブジェクトを使用します。

例を作成するには、標準の文字列は大文字と小文字を区別道("A"!= "a")で比較していますが、大文字小文字を区別しない方法であなたの文字列をハッシュすることができるようにIEqualityComparerヘルパークラスを作ることができます。注意点として

Hashtable用途:(彼らはStringComparer.InvariantCultureIgnoreCaseと呼ばれ、IComparerIEqualityComparerIComparer<string>IEqualityComparer<string>を実装StringComparerオブジェクトを返すStringComparerの他のすべての静的メソッド技術的に、このクラスは、複数のバリアントにすでに存在しています) a IEqualityComparerオプションのパラメータではなく、汎用バージョンIEqualityComparer<T>ではなく、Hashtableは事前ジェネリックであるためです。

1

IComparerインターフェイス(汎用と非汎用の両方)では、2つのインスタンスを互いに比較できます。

Compareメソッドを使用すると、オブジェクト自体を別のインスタンスと比較できます。 Offcourse、現在のインスタンスがnullの場合、 'null'インスタンスでCompareを呼び出したので、この場合はNullReferenceExceptionが返されます。 IComparerを実装するクラスは、この問題を克服できます。あなたがIComparerインターフェイスを実装する場合

そう、あなたは次のように呼び出すことができる「比較」メソッド、持っているクラスがあります:

public class MyObjectComparer : IComparer<MyObject> 
{ 
    public int Compare(MyObject first, MyObject second) 
    { 
     // implement logic here to determine whether first is less, greater or equal then second. 
    } 
} 

をこれは、あなたがこれを行うことができます:

var c = new MyObjectComparer(); 
var one = new MyObject(); 
var two = new MyObject(); 
c.Compare (one, two); 

あなたがIEqualityComparerインスタンスを指定するコンストラクタとHashtableをインスタンス化するとき、これは所与IEqualityComparerは、特定のキーがハッシュテーブルに既に存在するかどうかを決定するために使用されることを意味します。
それ以外の場合は、キーオブジェクトのCompareメソッドが使用されます。

関連する問題