Kja*_*ara 5 c# mapping set gethashcode
我正在寻找比列表具有更好性能但不使用内部方法的HashSet和Dictionary对象的内置替代方案GetHashCode。我需要这个,因为我写的类,没有写的方式GetHashCode与满足通常的合同法Equals比其他
public override int GetHashCode() { return 0; } // or return any other constant value
Run Code Online (Sandbox Code Playgroud)
这将打开HashSet,并Dictionary分为普通列表(性能明智)。
所以我需要的是一个集合实现和一个映射实现。有什么建议?
编辑:
我的类是基于容差的 3 维向量类:
public class Vector
{
private static const double TOL = 1E-10;
private double x, y, z;
public Vector(double x, double y, double z)
{
this.x = x; this.y = y; this.z = z;
}
public override bool Equals(object o)
{
Vector other = o as Vector;
if (other == null)
return false;
return ((Math.Abs(x - other.x) <= TOL) &&
(Math.Abs(y - other.y) <= TOL) &&
(Math.Abs(z - other.z) <= TOL));
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我的Equals方法不是可传递的。但是,在我的用例中,我可以使其“本地”传递,因为在某些时候,我将知道需要放入我的集合/映射键集中的所有向量,并且我也知道它们将成簇出现。所以当我收集了所有向量后,我会为每个集群选择一个代表,并用代表替换所有原始向量。然后Equals将在我的集合/映射键集的元素之间传递。
当我有我的集合或映射时,我将从另一个来源收集向量(为了这个问题,假设我会要求用户输入一个向量)。这些可以是任何可能的向量。这些永远不会添加到集合/映射中,但我需要知道它们是否包含在映射的集合/键集中(关于容差),并且我需要从映射中知道它们的值。
InB*_*een -2
根据您的情况,您可以获得相当好的哈希码实现。请记住,哈希码最重要的规则如下:
这并不意味着两个不同的向量不能返回相同的值;在某些情况下,他们显然必须这样做,散列的数量是有限的,但用于所有目的的不同向量的数量却不是。
好吧,考虑到这一点,只需根据截断为容差的有效数字减一的向量坐标来评估您的哈希码。所有相等的向量都会给你相同的散列,而少数最后一个小数不同的非相等向量不会......你可以接受这一点。
更新:将四舍五入更改为截断。四舍五入不是正确的选择。