AutoCADAPIを使用して2DAutoCAD図面を読み取り、定義されたビジネスロジックを使用して図面に変更を加えてから、AutoCADで調整するアプリケーションをC#3.5で作成しています。ロジックの性質上、図面の形状を再構築する必要があります。たとえば、長方形は4本の直線で構成されています。
AutoCADの各線の開始座標と終了座標を使用してこれらの形状を作成していますが、一部の座標が正確に一致していません。たとえば、1つのポイントは0.69912839(1つの軸上)にある可能性がありますが、同じポイントから始まる線は0.69990821である可能性があります。これらはmm単位であるため、距離は分です(0.00078mm!)
ロジックを追加する必要があるため、独自のクラス(PointFと同様にMyPointと呼びます)を作成しました。そのクラスでは、2つのdoubleを取り、2つのポイントが互いに0.001mm以内にあるかどうかに応じて、trueまたはfalseを返すメソッドを作成しました。次に、Equalsメソッド、==および!=演算子をオーバーライドして、すべての軸が互いに0.001mm以内にあるかどうかをチェックする(point1 == point2またはpoint1.Equals(point2))ことができるようにしました。同じ点として分類します。
それは問題なく、見事に機能しています。ここで、これらのポイントクラスのコレクションをチェックして、すべての重複を取り除く必要があるため、コレクションでLINQのDistinct()メソッドを使用しています。ただし、このメソッドは、Equals()ではなくGetHashcode()を使用して、インスタンスが等しいかどうかを判断します。そこで、doubleクラスのGetHashcodeを使用するGetHashcode()をオーバーライドしました。
ただし、上記の例は、明らかに異なる値であり、したがって異なるハッシュコードを生成するため、失敗します。互いに0.001以内にある2つの数値が同じハッシュコードを生成できる方法はありますか?(GetHashcodeは異なるクラスインスタンスで別々に呼び出されるため、番号はお互いを知らないことに注意してください。)いくつかの例では機能するが、他の例では機能しない多くの方法を試しました。
1つの例は、数値を3dpに切り捨て(10 ^ 3を掛けてから切り捨て)、結果にハッシュコードを作成することです。これは、上記の例(699 == 699)では機能しますが、0.69990821では機能しません。 0.70000120(699!= 700.)丸めを試しました。これは、2番目の数値セット(0.700 == 0.700)では機能しますが、最初の数値セット(0.699!= 0.700)では機能しません。数値を3dpに切り捨てることも試みました。次に、次の偶数まで調整します。これは、前の両方の例では機能しますが、12.9809と12.9818(12980!= 12982)では機能しません。
別の方法はありますか、またはEquals、==、!=、およびGetHashcodeオーバーライドを破棄して、独自のMyPoint.IsEqualTo()およびMyPointCollection.Distinct()メソッドを作成する必要がありますか?