gpt4 book ai didi

c# - HashSet 不会删除具有覆盖相等性的欺骗行为

转载 作者:行者123 更新时间:2023-12-03 09:27:45 26 4
gpt4 key购买 nike

我有课Pair ,由于它存储的两个值可以互换,所以需要有一个重写的相等运算符,代码是这样的

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 添加 EqualsGetHashCode方法,我知道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!

最佳答案

您的 GetHashCode 实现不会为 (A, B) 和 (B, A) 返回相同的值。 HashSet 检查它在插入时是否已经包含给定的哈希值。如果不是,则该对象将被视为新对象。

如果您更正 GetHashCode,则在插入第二个 Pair 时,HashSet 将发现哈希码已存在,并且验证与共享相同哈希码的其他对象的相等性。

关于c# - HashSet 不会删除具有覆盖相等性的欺骗行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16908623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com