gpt4 book ai didi

c# - 如何实现具有容差的 IEqualityComparer

转载 作者:太空狗 更新时间:2023-10-29 20:00:46 25 4
gpt4 key购买 nike

这个问题类似于the one here .

我们都知道什么PointF是,不是吗?这是数据结构:

public struct PointF
{
public float X;
public float Y;
}

如何实现IEqualityComparer<PointF>宽容?比方说我的 Equals代码是这样的

public const float Epsilon = 0.01; //say
public bool Equals(PointF pt1, PointF pt2)
{
return Math.Abs(pt1.X-pt2.X)<Epsilon && Math.Abs(pt1.Y-pt2.Y)<Epsilon;
}

问题:如何实现正确的GetHashCode这样对于 PointF 的字典, 我会正确访问元素吗?

我绞尽脑汁想了几天还是找不到满意的解决方案。

最佳答案

您可以将点放置在网格中,而不是通过距离定义公差。
如果两个点在同一个单元格中,则它们被认为是相等的并且具有相同的哈希码。

public bool Equals(PointF pt1, PointF pt2)
{
return GetCell(pt1.X) == GetCell(pt2.X)
&& GetCell(pt1.Y) == GetCell(pt2.Y);
}

public int GetHashCode(PointF pt)
{
return GetCell(pt.X) ^ GetCell(pt.Y);
}

private static int GetCell(float f)
{
return (int)(f / 10); // cell size is 10 pixels
}

论文EqualsGetHashCode的实现都没有满足你的要求。

证明:考虑以下三点 A、B 和 C:

Illustration

根据您的要求,

Equals(A, B) == true              // (i)
Equals(B, C) == true // (ii)
Equals(A, C) == false // (iii)
GetHashCode(A) == GetHashCode(B) // (iv)
GetHashCode(B) == GetHashCode(C) // (v)
GetHashCode(A) != GetHashCode(C) // (vi)

但是从 (iv) 和 (v) 如下

GetHashCode(A) == GetHashCode(C)

因此

Equals(A, C) == true

这与 (iii) 和 (vi) 相矛盾。

由于EqualsGetHashCode 不能为相同的参数返回不同的值,因此没有满足您要求的实现。q.e.d.

关于c# - 如何实现具有容差的 IEqualityComparer<PointF>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2055422/

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