X が Y と等しいことが観測され、Y が Z と等しいことが観測され、どの項目も変更されていない場合、XEquals(Object)
はIEquatable<T>.Equals(T)
Z; さらに、X が Y に等しく、Y がZ に等しくない場合、X も Z にも等しくないと見なすことができます。ワイルドカードおよびファジー比較メソッドは等価関係を実装していないため、Equals
一般にそのようなセマンティクスを実装するべきではありません。
Equals
多くのコレクションは、同等の関係を実装しない方法で実装されたオブジェクトでちょっとした動作をします。ただし、2 つのオブジェクトが互いに等しいと比較すると、常に同じハッシュ コードが返されます。これを行うには、多くの場合、等しくないものを比較して同じハッシュ コードを返す必要がありますが、サポートされているワイルドカードの種類によっては、項目をある程度分けることができる場合があります。
たとえば、特定の文字列がサポートする唯一のワイルドカードが「1 つ以上の数字の任意の文字列」を表す場合、連続する数字のすべてのシーケンスおよび/または文字列のワイルドカード文字を単一の「文字列」に変換することにより、文字列をハッシュできます。 of digits」ワイルドカード文字。# が任意の数字を表す場合、文字列 abc123、abc#、abc456、および abc#93#22#7 はすべて abc# と同じ値にハッシュされますが、abc#b、abc123b などは別の値にハッシュされる可能性があります。価値。文字列の分布に応じて、このような区別によって、定数値を返すよりもパフォーマンスが向上する場合とされない場合があります。
GetHashCode
等しいオブジェクトが等しいハッシュを生成するような方法で実装したとしても、等値メソッドが等価関係を実装していない場合、一部のコレクションは依然として奇妙な動作をする可能性があることに注意してください。たとえば、コレクションfoo
にキーが「abc1」と「abc2」の項目が含まれている場合、アクセスを試みるとfoo["abc#"]
、最初の項目または 2 番目の項目が勝手に返される可能性があります。キー「abc#」を削除しようとすると、一方または両方のアイテムが任意に削除されるか、1 つのアイテムを削除した後で失敗する可能性があります (削除abc#
後もコレクションに含まれるため、予期される事後条件が満たされない可能性があります)。
ジンクスEquals
を使ってハッシュ コードの等価性を比較しようとする代わりに、少なくとも 1 つのメイン コレクション文字列に一致する可能性のあるワイルドカード文字列ごとに、一致する可能性のある文字列のリストを保持する辞書を用意するという代替アプローチがあります。したがって、abc# に一致する文字列が多数ある場合、それらはすべて異なるハッシュ コードを持つ可能性があります。ユーザーが検索リクエストとして「abc#」を入力すると、システムはワイルドカード辞書で「abc#」を検索し、そのパターンに一致するすべての文字列のリストを受け取り、メイン辞書で個別に検索できます。 .