Я создал специальную структуру данных «Координаты», которая определяет положение объекта в соответствии с определенной системой.
Координата определяется следующим образом:
public class Coordinate
{
public int X;
public int Y;
private int face;
public int Face
{
get { return face; }
set
{
if (value >= 6 | value < 0)
throw new Exception("Invalid face number");
else
face = value;
}
}
private int shell;
public int Shell
{
get { return shell; }
set
{
if (value < 0)
throw new Exception("No negative shell value allowed");
else
shell = value;
}
}
public Coordinate(int face, int x, int y, int shell)
{
this.X = x;
this.Y = y;
this.face = face;
this.shell = shell;
}
public static Coordinate operator +(Coordinate a, Coordinate b)
{
return new Coordinate(a.Face + b.Face, a.X + b.X, a.Y + b.Y, a.Shell + b.Shell);
}
public override bool Equals(object obj)
{
Coordinate other = (obj as Coordinate);
if (other == null)
return false;
else
return (Face == other.Face && Shell == other.Shell && X == other.X && Y == other.Y);
}
}
Или, чтобы резюмировать, она содержит int Face (от 0 до 5), int X, int Y и int Shell. X, Y и Shell все связаны снизу с 0 (включительно).
У меня вообще нет опыта работы с хэш-кодами. Мне нужно сравнить их, чтобы увидеть, равны ли они. Я пробовал это:
private const int MULTIPLIER = 89;
[...]
int hashCode = 1;
hashCode = MULTIPLIER * hashCode + obj.X.GetHashCode();
hashCode = MULTIPLIER * hashCode + obj.Y.GetHashCode();
hashCode = MULTIPLIER * hashCode + obj.Face.GetHashCode();
hashCode = MULTIPLIER * hashCode + obj.Shell.GetHashCode();
return hashCode;
Отключение чего-то, что я нашел во время поиска в Google. Но когда я пытаюсь скомпилировать код этим методом, я почти уверен, что он сталкивается с коллизиями, так как сборка никогда не завершается. Вероятно, попадание во всевозможные беспорядочные циклы, думая, что связка координат одинакова или что-то вроде того.
Прошу прощения, это элементарный вопрос, но я почему-то в тупике. Я просто ищу совета, как написать этот хеш-код, чтобы он не конфликтовал.