gpt4 book ai didi

c# - 使用等于。 GetHashCode 不是

转载 作者:行者123 更新时间:2023-11-30 14:06:43 24 4
gpt4 key购买 nike

我已经实现了下面的类:

public class carComparer : IEqualityComparer<Car>
{
public bool Equals(Car car1, Car car2)
{
if (car1 == null || car2 == null)
return false;

return (car1.description == car2.description);
}

public int GetHashCode(Car car)
{
unchecked
{
int hash = 17;
hash = hash * 29 + car.id.GetHashCode();
hash = hash * 29 + car.description.GetHashCode();
return hash;
}
}

}

现在看这个:

Car p1 = new Car() { id = Guid.NewGuid(), description = "Test1" };
Car p2 = new Car() { id = Guid.NewGuid(), description = "Test1" };
Car p3 = new Car() { id = Guid.NewGuid(), description = "Test1" };
Car p4 = new Car() { id = Guid.NewGuid(), description = "Test1" };
var hash = new HashSet<Car>();
hash.Add(p1);
hash.Add(p2);

var hash2 = new HashSet<Car>();
hash2.Add(p3);
hash2.Add(p4);

var carComparer = new CarComparer();
Assert.That(hash, Is.EquivalentTo(hash2).Using(carComparer));

我在 .equals 和 .hashcode 中设置了断点。使用等于;但 GetHashCode 不是。为什么?

最佳答案

您正在使用 NUnit Is.EquivalentTo 比较两个 HashSet。它没有理由调用 GetHashCode - 它基本上比较两个集合的成员是否相等。这就是为什么永远不会调用 GetHashCode 而调用 Equals 来比较来自不同 HashSet 的两个项目是否相等的原因。您的哈希集也可以是列表或任何其他可枚举的 - 在比较两个集合时不会改变任何内容。

您可能希望在将项目添加到 HashSet 时调用 GetHashCode - 但事实并非如此,因为此时您的 carComparer 是还不知道 - 你不会将它传递给 HashSet 构造函数。如果你这样做:

var hash = new HashSet<Car>(new carComparer());

然后,当您将新项目添加到相应的HashSet 时,将调用GetHashCode

关于c# - 使用等于。 GetHashCode 不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45753016/

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