Я создаю приложение в C # 3.5, которое использует API AutoCAD для чтения 2D-чертежа AutoCAD, вносит изменения в чертеж с использованием определенной бизнес-логики, а затем корректирует его обратно в AutoCAD. Из-за природы логики форму рисунка необходимо перестроить, например, прямоугольник состоит из 4 соединительных прямых линий.
Я создаю эти фигуры, используя начальную и конечную координаты каждой линии из AutoCAD, но некоторые координаты не совсем совпадают. Например, одна точка может иметь значение 0,69912839 (на одной оси), но линия, начинающаяся с той же точки, может быть 0,69990821. Они указаны в мм, поэтому расстояние составляет минуты (0,00078 мм!)
Я создал свой собственный класс (назовите его MyPoint, похожий на PointF), потому что мне нужно было добавить к нему дополнительную логику. В этом классе я создал метод, который принимает две двойные и возвращает истину или ложь в зависимости от того, находятся ли две точки в пределах 0,001 мм друг от друга. Затем я переопределил метод Equals, операторы == и! =, Чтобы я мог сделать (point1 == point2 или point1.Equals (point2)), который проверяет, все ли оси находятся в пределах 0,001 мм друг от друга - если они оцените это как одно и то же.
Это нормально и блестяще работает. Теперь мне нужно проверить коллекцию этих точечных классов, чтобы избавиться от всех дубликатов, поэтому я использую метод Distinct () LINQ в своей коллекции. Однако этот метод использует GetHashcode (), а не Equals (), чтобы определить, равны ли экземпляры. Итак, я переопределил GetHashcode (), который использует GetHashcode двойного класса.
Но вышеприведенный пример терпит неудачу, потому что, очевидно, они имеют разные значения и, следовательно, генерируют разные хеш-коды. Есть ли способ, что два числа, которые находятся в пределах 0,001 друг от друга, могут генерировать один и тот же хэш-код? (Обратите внимание, что числа не знают друг о друге, так как GetHashcode вызывается отдельно для разных экземпляров классов.) Я пробовал множество способов, которые работают для некоторых примеров, но не для других.
Одним из примеров является усечение числа до 3dp (умножение его на 10 ^ 3, затем усечение его) и создание хеш-кода для результата - который работает для приведенного выше примера (699 == 699.) Но это не работает для 0,69990821 и 0,70000120 (699! = 700). Я пробовал округление, которое работает для второго набора чисел (0,700 == 0,700), но не для первого (0,699! = 0,700.) Я даже пытался обрезать число в 3dp, затем корректируем его до следующего четного числа, которое работает для обоих предыдущих примеров, но не для 12.9809 и 12.9818 (12980! = 12982.)
Есть ли другой способ или я должен удалить переопределения Equals, ==,! = И GetHashcode и создать мои собственные методы MyPoint.IsEqualTo () и MyPointCollection.Distinct ()?