这是我的测试代码(包含应该返回的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/

10-13 04:09