GetHashCode - это не про сравнение, а про генерацию хэша для объекта.
Хэши могут пересекаться, тк количество хэшэй принципиально меньше количества уникальных объектов.
По тому, если тебе нужно ответить на вопрос "равен ли объект А объекту Б", то обязательно нужно проверить на Equals.
Чтобы при разных типах у тебя не было ложного совпадения - просто сравнивай ещё и тип в Equals (через GetType)
Если тебе нужно сравнить объекты по принципу больше/меньше/равно, то тут к тебе на помощь приходит интерфейс IComparable.