К сожалению, у меня недостаточно репутации, чтобы комментировать другие записи. Так что я публикую здесь возможное улучшение топ-решения.
Поправьте меня, если я не прав, но реализация упомянута выше
public struct Complex
{
double re, im;
public override bool Equals(Object obj)
{
return obj is Complex && this == (Complex)obj;
}
public override int GetHashCode()
{
return re.GetHashCode() ^ im.GetHashCode();
}
public static bool operator ==(Complex x, Complex y)
{
return x.re == y.re && x.im == y.im;
}
public static bool operator !=(Complex x, Complex y)
{
return !(x == y);
}
}
Имеет большой недостаток. Я ссылаюсь на
public override int GetHashCode()
{
return re.GetHashCode() ^ im.GetHashCode();
}
XORing является симметричным, поэтому Complex (2,1) и Complex (1,2) будут иметь одинаковый хэш-код.
Мы, вероятно, должны сделать что-то вроде:
public override int GetHashCode()
{
return re.GetHashCode() * 17 ^ im.GetHashCode();
}