考虑以下对象:
class Route
{
public int Origin { get; set; }
public int Destination { get; set; }
}
路由实现相等运算符。
class Routing
{
public List<Route> Paths { get; set; }
}
我使用下面的代码为 Routing 对象实现 GetHashCode 方法,它似乎有效,但我想知道这是否是正确的方法?我依赖平等检查,因为我不确定,所以我想我会问你们。我可以只对哈希码求和还是需要做更多的事情才能保证预期的效果?
public override int GetHashCode() =>
{
return (Paths != null
? (Paths.Select(p => p.GetHashCode())
.Sum())
: 0);
}
我检查了几个GetHashCode()
问题在这里以及MSDN和Eric Lippert关于这个主题的文章,但找不到我要找的东西。
我认为你的解决方案很好。 (很久以后的评论:LINQ 的Sum
方法将作用于checked
上下文,所以你可以很容易地得到OverflowException
这意味着它毕竟不是那么好。)但更常见的是进行 XOR(不进位加法)。所以它可能是这样的
public override int GetHashCode()
{
int hc = 0;
if (Paths != null)
foreach (var p in Paths)
hc ^= p.GetHashCode();
return hc;
}
附录(答案被接受后):
请记住,如果您曾经使用过这种类型Routing
in a Dictionary<Routing, Whatever>
, a HashSet<Routing>
或者使用哈希表的另一种情况,那么您的实例将是lost如果有人改变(变异)Routing
将其添加到集合后。
如果您确定这种情况永远不会发生,请使用我上面的代码。Dictionary<,>
如果你确保没有人改变的话,依此类推仍然有效Routing
所引用的。
另一种选择是只写
public override int GetHashCode()
{
return 0;
}
如果您认为哈希码永远不会被使用。如果每个实例都返回0
对于哈希码,使用哈希表会获得非常糟糕的性能,但您的对象不会丢失。第三种选择是抛出一个NotSupportedException
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)