gpt4 book ai didi

c# - 比较对象,忽略成员的 "order"

转载 作者:太空宇宙 更新时间:2023-11-03 19:46:00 25 4
gpt4 key购买 nike

我有以下对象。

public class Foo
{
public int X { get; }
public int Y { get; }

public Foo(int x, int y)
{
this.X = x;
this.Y = y;
}
}

现在我想覆盖 Equals 和 GetHashCode 方法,这两个对象应该被视为相等(和相同的哈希码)。

var foo1 = new Foo(1, 2);
var foo2 = new Foo(2, 1);

我知道如何编写 Equals 方法,但我很难理解 get hashcode 方法。

这是我当前的版本:

public override int GetHashCode()
{
unchecked
{
return (_x * 397) ^ _y;
}
}

在我当前的解决方案中——没有工作——foo1 的 HashCode 为 399,而 foo2 的 HashCode 为 795。

我需要两者完全相同。

最佳答案

您需要一个转换使得 f(x,y) = f(y,x)。我能想到一些应该做到这一点的数学性质——任何可交换的东西都应该起作用,例如简单的乘法。

public override int GetHashCode()
{
unchecked
{
return _x * _y;
}
}

不确定收敛的可能性有多大,并且对于大量字段可能会更棘手。作为替代方案,您可以在散列之前强制将可交换参数按排序顺序排列:

public override int GetHashCode()
{
var x = Math.Min(_x, _y);
var y = Math.Max(_x, _y);
unchecked
{
return (x * 397) ^ y;
}
}

或者,如果您有三个或更多字段:

public override int GetHashCode()
{
var a = new int[] { _x, _y, _z };
Array.Sort(a);
unchecked
{
return ((a[0] * 397) ^ a[1]) * 397 ^ a[2];
}
}

使用 LINQ 可能是一种更聪明的方法,但您明白了。

关于c# - 比较对象,忽略成员的 "order",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45516998/

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