IEqualityComparer<T>
がオブジェクトと比較されると、最初にハッシュコードが比較されます。等しい場合にのみEquals
メソッドを使用して比較を絞り込みます。あなたの場合、少なくともEquals
を2回押してください。
EqualityComparerは私がLinqpadに少しのコードスニペットを作ったん何を実証するために:
void Main()
{
var ss = new string[] { "aa1", "bb1", "cc1" };
var zz = new string[] { "aa2", "aa3", "zz2", "cc2" };
var res = ss.Join(zz, o => o, i => i, (i, o) => i + o,
new SubstringComparer()).ToList();
}
public class SubstringComparer : IEqualityComparer<string>
{
public bool Equals(string left, string right)
{
string.Format("{0} - {1}", left, right).Dump();
return left.Substring(0,2) == right.Substring(0,2);
}
public int GetHashCode(string value)
{
value.Dump();
return value.Substring(0,2).GetHashCode();
}
}
彼らの最初の2つの文字が等しいのであれば、文字列が等しいです。出力は次のとおり
AA2
AA3
AA2 - CC1
から
BB1
CC1
CC2 AA1 -
ZZ2
CC2
AA1
AA2 AA3そして、リスト:あなたが第一、第二のリストは、その後、比較(ちなみに、多分ハッシュコードがキャッシュされている理由を、私はよく分からない)とされていることが分かり
aa1aa2
aa1aa3
cc1cc2
ペア。
だから、何とかいつも私がバグであるべきだと思うユニークなハッシュコードを生成するとき、あなたのGenericEqualityComparer
決してヒットEquals
。 が必ずしもでない場合は、Equals
を使用してください。ここで説明します。そして、比較者をにする場合は、常にを使用してください。Equals
を使用する場合は、常に同じハッシュコードを返さなければなりません(これはもちろん非効率です)。
それは_never_または_常にalways_が 'Equals'を使用していないことを意味しますか? –