|
|
1
2
只需删除对Distinct方法的依赖就更容易了。实现System.Collections.IComparer(或通用等效工具),并使用简单的集合,如列表。然后使用比较器确定该项是否在列表中,如果已包含该项,则不要添加该项。 |
|
|
2
3
它无法编写正确的哈希代码。让我们证明一下: var a=point1.GetHashCode(); 如果是b让我们在点1和点2之间创建点。等等 所以点1和点2的哈希代码应该相等。 因此,我们应该这样做:
|
|
|
3
3
我认为你不应该凌驾于此
如果覆盖其中任何一个,则应确保它们的语义不会更改。在你的例子中,他们是这样做的。
我会坚持使用单独的方法来确定点是否足够接近。 编辑
用你的超控
|
|
4
1
我猜如果您总是返回相同的散列(比如0),LinQ将尝试将所有元素与
但无论如何,我建议您使用更适合这个领域的结构和算法,比如二进制分割分区(BSP)树。 |
|
|
5
1
这应该是对斯特克和保罗所说的更清楚的解释。
证据:假设
然后
|
|
|
6
1
对 不过,它不一定是完全不同的数据结构。在检查重复项时,需要检查相邻的哈希代码,例如(x+0.001,y)、(x,y-0.001)的哈希,等等。与通常的重复数据消除查找相比,这只会使速度持续下降,而且并不复杂,因此这可能是一种可行的方法(这是一个显而易见的观点,但我认为这里还没有明确指出。)
为了澄清,让我们看一下问题的一维版本。“点”是单个数字,x。我们认为X1和X2是匹配的。
在二维变型中,有9个相邻的铲斗需要检查(计算中间);在3-d中,27。 |
|
|
7
0
这里有一些代码来说明我在做什么。“原始”中的每对数字都应返回相同的值。
上述方法是“截断为3dp,然后调整为最接近的偶数”方法。接下来是truncate方法(替换开始/结束注释之间的代码):
这是四舍五入法:
|