Ответ 1
Все, что мне нужно, - это эффективный способ получить единственное уникальное значение, основанное на Pos.x и Pos.y, для использования в качестве словарного ключа.
Не используйте ToString
как способ создания уникальных словарных клавиш, вместо этого используйте IEquatable<Pos>
. Таким образом, вам не нужно выделять никакие строки для измерения равенства:
public struct Pos : IEquatable<Pos>
{
public int X { get; private set; }
public int Y { get; private set; }
public float Height { get; private set; }
public Pos(int x, int y, float height)
{
X = x;
Y = y;
Height = height;
}
public bool Equals(Pos other)
{
return X == other.X && Y == other.Y;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
return obj is Pos && Equals((Pos) obj);
}
public override int GetHashCode()
{
unchecked
{
return (X*397) ^ Y;
}
}
public static bool operator ==(Pos left, Pos right)
{
return left.Equals(right);
}
public static bool operator !=(Pos left, Pos right)
{
return !left.Equals(right);
}
}
Заметьте, что вы можете удалить private set
из объявлений свойств, если используете С# -6.