gpt4 book ai didi

c# - 为近似相似的数字生成相同的哈希码

转载 作者:行者123 更新时间:2023-11-30 13:34:45 26 4
gpt4 key购买 nike

我正在使用 C# 3.5 创建一个应用程序,它使用 AutoCAD API 读取 2D AutoCAD 绘图,使用定义的业务逻辑对绘图进行更改,然后在 AutoCAD 中将其调整回来。由于逻辑的性质,必须重新构造绘图的形状 - 例如一个矩形由 4 条连接的直线组成。

我正在使用 AutoCAD 中每条线的起点和终点坐标创建这些形状,但有些坐标并不完全匹配。例如,一个点可能在 0.69912839(在一个轴上),但从同一点开始的线可能是 0.69990821。这些以毫米为单位,所以距离很小(0.00078 毫米!)

我创建了自己的类(称之为 MyPoint,类似于 PointF),因为我需要向它添加一些额外的逻辑。在那个类中,我创建了一个方法,它接受两个 double 值并返回 true 或 false,具体取决于两个点之间的距离是否在 0.001mm 以内。然后我覆盖了 Equals 方法,== 和 != 运算符,这样我就可以做 (point1 == point2 or point1.Equals(point2)) 检查所有轴是否在彼此的 0.001mm 以内 - 如果它们是,我将其归类为同一个点。

这很好,而且工作出色。现在,我需要检查这些点类的集合以去除所有重复项,因此我在我的集​​合上使用了 LINQ 的 Distinct() 方法。但是,此方法使用 GetHashcode() 而不是 Equals() 来确定实例是否相等。因此,我覆盖了使用双类的 GetHashcode 的 GetHashcode()。

但是,上面的例子失败了,因为很明显它们是不同的值,因此生成不同的哈希码。有什么方法可以使彼此相差 0.001 以内的两个数字生成相同的哈希码? (请注意,由于 GetHashcode 是在不同的类实例上分别调用的,因此数字彼此不了解。)我尝试了多种方法,这些方法适用于某些示例,但不适用于其他示例。

一个示例是将数字截断为 3dp(将其乘以 10^3,然后截断)并在结果上创建哈希码 - 这适用于上面的示例(699 == 699。)但这不起作用对于 0.69990821 和 0.70000120 (699 != 700.) 我试过四舍五入,它适用于第二组数字 (0.700 == 0.700) 但不适用于第一组 (0.699 != 0.700.) 我什至尝试过截断number 到 3dp 然后将其调整为下一个偶数,这适用于前面的两个示例,但不适用于 12.9809 和 12.9818 (12980 != 12982.)

是否有其他方法,或者我应该放弃 Equals、==、!= 和 GetHashcode 覆盖,并创建我自己的 MyPoint.IsEqualTo() 和 MyPointCollection.Distinct() 方法?

最佳答案

无法写入正确的哈希码。让我们证明一下:我们有2分。var a = point1.GetHashCode();var b = point2.GetHashCode();

如果 a!= b 让在 point1 和 point2 之间创建点。等等。

在这样的操作之后,我们将创建线,其中每个点都靠近其他点,并且它们的哈希码将相同。因此 point1 和 point2 的哈希码应该相等。

像这样覆盖:

public override int GetHashCode()
{
return 0;
}

并实现平等。

关于c# - 为近似相似的数字生成相同的哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250659/

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