Gra*_*ton 7 c# iequalitycomparer
这个问题类似于这里的问题.
我们都知道PointF是什么,不是吗?这是数据结构:
public struct PointF
{
public float X;
public float Y;
}
Run Code Online (Sandbox Code Playgroud)
如何实施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;
}
Run Code Online (Sandbox Code Playgroud)
问题:如何实现正确的,GetHashCode以便对于字典PointF,我会正确访问元素?
我几天头脑裂开但仍然无法找到满意的解决方案.
dtb*_*dtb 14
您可以将点放在网格中,而不是通过距离定义公差.
如果两个点在同一个单元格中,则它们被认为是相等的并且具有相同的哈希码.
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
}
Run Code Online (Sandbox Code Playgroud)
论文:没有实现Equals并GetHashCode满足您的要求.
证明:考虑以下三点,A,B和C:
插图http://i45.tinypic.com/10wlmkx.png
根据您的要求,
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)
Run Code Online (Sandbox Code Playgroud)
但是从(iv)和(v)开始
GetHashCode(A) == GetHashCode(C)
Run Code Online (Sandbox Code Playgroud)
从而
Equals(A, C) == true
Run Code Online (Sandbox Code Playgroud)
这与(iii)和(vi)相矛盾.
由于Equals并且GetHashCode不能为相同的参数返回不同的值,因此没有满足您要求的实现.
QED
| 归档时间: |
|
| 查看次数: |
1291 次 |
| 最近记录: |