ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-17 04:04:20  阅读:111  来源: 互联网

标签:c math coordinates autocad


我在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(或通用等价物)并使用类似列表的简单集合.然后使用比较器确定该项是否在列表中,如果已包含该项,则不添加该项.

标签:c,math,coordinates,autocad
来源: https://codeday.me/bug/20190717/1484771.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有