私は class を持ってPair
います。これは、格納する 2 つの値が交換可能であるため、オーバーライドされた等値演算子を持つ必要があります。コードは次のとおりです。
Pair.cs
public class Pair
{
protected bool Equals(Pair other)
{
return (Equals(A, other.A) && Equals(B, other.B)) || (Equals(A, other.B) && Equals(B, other.A));
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
return obj.GetType() == this.GetType() && Equals((Pair) obj);
}
public override int GetHashCode()
{
unchecked
{
return ((A != null ? A.GetHashCode() : 0)*397) ^ (B != null ? B.GetHashCode() : 0);
}
}
public readonly Collision A, B;
public Pair(Collision a, Collision b)
{
A = a;
B = b;
}
public static bool operator ==(Pair a, Pair b)
{
if (ReferenceEquals(a, b))
return true;
if ((object)a == null || (object)b == null)
return false;
return (a.A == b.A && a.B == b.B) || (a.A == b.B && a.B == b.A);
}
public static bool operator !=(Pair a, Pair b)
{
return !(a == b);
}
}
ReSharper にEquals
andGetHashCode
メソッドを追加してもらいました。問題ないことEquals
はわかっていますがGetHashCode
、正しい値を出力していますか?
ペアをHashSet<Pair>
保存するために使用する があり、このリストに重複がないことを確認する必要がありますが、ペアを に追加してHashSet
も重複は削除されません。
明確にするために、これは重複します:
Pair a = new Pair(objecta, objectb);
Pair b = new Pair(objectb, objecta);
HashSet<Pair> pairs = new HashSet<Pair>();
pairs.Add(a);
pairs.Add(b);
return pairs.Count(); //Count() returns 2 when it should be 1!