这是我的测试代码(包含应该返回的true):
HashSet<TilePosition> test = new HashSet<TilePosition>(new TilePositionCompare());
test.Add(new TilePosition(10,10));
if (test.Contains(new TilePosition(10,10)))
Debug.Log("We should see this");
我的比较班:
使用System.Collections.Generic;
public class TilePositionCompare : IEqualityComparer<TilePosition>
{
public bool Equals(TilePosition tileA, TilePosition tileB)
{
return tileA.PosX == tileB.PosX && tileA.PosY == tileB.PosY;
}
public int GetHashCode(TilePosition tile)
{
return tile.GetHashCode();
}
}
这是我要比较的课程:
using System.Collections;
public class TilePosition
{
int posX;
int posY;
public TilePosition (int posX, int posY)
{
this.posX = posX;
this.posY = posY;
}
}
我不确定我要去哪里。我遵循了一些看起来可能做同样事情的教程。
最佳答案
GetHashCode()
应基于X / Y。
public class TilePositionCompare : IEqualityComparer<TilePosition>
{
public bool Equals(TilePosition tileA, TilePosition tileB)
{
return tileA.PosX == tileB.PosX && tileA.PosY == tileB.PosY;
}
public int GetHashCode(TilePosition tile)
{
var hash = 17;
hash = hash * 23 + tile.PosX.GetHashCode();
hash = hash * 23 + tile.PosY.GetHashCode();
return hash;
}
}
https://stackoverflow.com/a/263416/70386中采用的示例
要知道为什么使用奇数质数(17),请在此处阅读:Why does Java's hashCode() in String use 31 as a multiplier?
关于c# - IEqualityComparer给出错误的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21055916/