c# – 为大致相似的数字生成相同的Hash码

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

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

我已经创建了自己的类(称之为MyPoint,类似于PointF),因为我需要为它添加一些额外的逻辑.在那个类中,我创建了一个方法,它接受两个双精度并返回true或false,具体取决于两个点是否在彼此的0.001mm之内.我已经覆盖了Equals方法,==和!=运算符,所以我可以做(point1 == point2或point1.Equals(point2)),检查所有轴是否在彼此的0.001mm之内 – 如果它们是,我把它归类为同一点.

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

但是,上面的示例失败了,因为它们显然是不同的值,因此生成不同的哈希码.有两种方法可以生成相同的哈希码吗? (注意数字彼此不了解,因为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()方法?

解决方法:

删除对Distinct方法的依赖会更容易.实现System.Collections.IComparer(或通用等价物)并使用类似列表的简单集合.然后使用比较器确定该项是否在列表中,如果已包含该项,则不添加该项.

上一篇:如何将AutocadDWG转换为PDF?


下一篇:AutoCAD VBA添加菜单