我在 C# 3.5 中创建一个应用程序,它使用 AutoCAD API 读取 2D AutoCAD 绘图,使用定义的业务逻辑对绘图进行更改,然后在 AutoCAD 中对其进行调整。由于逻辑的性质,必须重新构造图形的形状——例如,一个矩形由 4 条连接直线组成。
我正在使用 AutoCAD 中每条线的开始和结束坐标创建这些形状,但有些坐标并不完全匹配。例如,一个点可能在 0.69912839(在一个轴上),但从同一点开始的线可能是 0.69990821。这些以毫米为单位,因此距离很短(0.00078 毫米!)
我创建了自己的类(称为 MyPoint,类似于 PointF),因为我需要向它添加一些额外的逻辑。在那个类中,我创建了一个方法,它接受两个双精度值并根据两个点是否在 0.001 毫米内返回真或假。然后,我重写了 Equals 方法、== 和 != 运算符,因此我可以执行 (point1 == point2 或 point1.Equals(point2)) 检查所有轴是否彼此相距 0.001mm - 如果是,我将其归类为同一点。
这很好,工作出色。现在,我需要检查这些点类的集合以消除所有重复项,因此我在我的集合上使用 LINQ 的 Distinct() 方法。但是,此方法使用 GetHashcode(),而不是 Equals() 来确定实例是否相等。所以,我已经覆盖了 GetHashcode(),它使用了 double 类的 GetHashcode。
但是,上面的示例失败了,因为显然它们是不同的值,因此会生成不同的哈希码。有什么方法可以让两个相差在 0.001 以内的数字生成相同的哈希码?(请注意,这些数字彼此不知道,因为 GetHashcode 在不同的类实例上分别调用。)我尝试了许多适用于某些示例但不适用于其他示例的方法。
一个示例是将数字截断为 3dp(将其乘以 10^3,然后截断它)并在结果上创建哈希码 - 这适用于上述示例(699 == 699。)但这不适用于 0.69990821 和0.70000120 (699 != 700.) 我试过四舍五入,它适用于第二组数字 (0.700 == 0.700) 但不适用于第一组 (0.699 != 0.700。) 我什至尝试将数字截断为 3dp然后将其调整为下一个偶数,这适用于前面的两个示例,但不适用于 12.9809 和 12.9818 (12980 != 12982.)
有没有其他方法,或者我应该废弃 Equals、==、!= 和 GetHashcode 覆盖,并创建我自己的 MyPoint.IsEqualTo() 和 MyPointCollection.Distinct() 方法?