2014-01-10 12 views
1

Вот мой тестовый код (содержит не возвращает истину, когда оно должно быть):IEqualityComparer дает неправильный результат

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; 
} 
} 

Я не уверен, где я неправильно. Я следил за некоторыми учебниками, которые, похоже, делают то же самое.

+0

Вы, кажется, использует свойства PosX и Пози в методе Equals, где они в вашем классе? – SpaceghostAli

ответ

4

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?

+1

В более общем случае, если 'Equals (x, y)' истинно для любых двух объектов * x * и * y *, то правильная реализация 'GetHashCode' * должна * гарантировать, что' GetHashCode (x) == GetHashCode (y) '. Несоблюдение этого требования является истинной причиной «неправильного результата», сообщенного исходным вопросом. –

Смежные вопросы