実装方法にIEqualityComparer<PointF> 耐性
-
20-09-2019 - |
質問
この質問は はこちら.
しか PointF はないといけませんね。このデータ構造:
public struct PointF
{
public float X;
public float Y;
}
実装方法" IEqualityComparer<PointF>
耐性?ちっ Equals
コードは以下のようになっています
public const float Epsilon = 0.01; //say
public bool Equals(PointF pt1, PointF pt2)
{
return Math.Abs(pt1.X-pt2.X)<Epsilon && Math.Abs(pt1.Y-pt2.Y)<Epsilon;
}
質問どのように実施し修正 GetHashCode
そのための辞書の PointF
, まアクセスの要素を確認してください。◆
Iき裂頭の数日間もなく満足のいく解決策です。
解決
を定義"するのではなく、寛容の距離のポイントのグリッド
の場合はポイントと同じ細胞という大きさでありながら考える等して、同じハッシュコードです。
public bool Equals(PointF pt1, PointF pt2)
{
return GetCell(pt1.X) == GetCell(pt2.X)
&& GetCell(pt1.Y) == GetCell(pt2.Y);
}
public int GetHashCode(PointF pt)
{
return GetCell(pt.X) ^ GetCell(pt.Y);
}
private static int GetCell(float f)
{
return (int)(f / 10); // cell size is 10 pixels
}
論文 ありませんの実施 Equals
や GetHashCode
お客様のご要望に合わせて、.
証明: 次の三つのポイントA、B、C:
として、貴社の要件
Equals(A, B) == true // (i)
Equals(B, C) == true // (ii)
Equals(A, C) == false // (iii)
GetHashCode(A) == GetHashCode(B) // (iv)
GetHashCode(B) == GetHashCode(C) // (v)
GetHashCode(A) != GetHashCode(C) // (vi)
だから(iv)、(v)以下
GetHashCode(A) == GetHashCode(C)
を
Equals(A, C) == true
る反(iii)及び(vi)
以降 Equals
や GetHashCode
は異なる値と同じ引数が実施お客様のご要望に合わせて、.q.e.d.
他のヒント
いと思うのですが、無限の列の値が等しい(以内の公差)の前後の値の配列がないその他の価値 GetHashCode
うを返す必要が同一の値を全員について記入してください。
でもその答えに基づきグリッドがもうけられることがありまめグループのポイントとにかくない場合でも、同じ系統の細胞。私のアプローチを継続して実施することの分類:二点は同じグループのいずれかでありまたは列のポイントに接続します。この意味はできません正しく IEqualityComparer
, でのニーズを知る全ての項目を事前に生産します。いう単純なLINQ-スタイルオペレーター GroupByCluster
, 基本的には実現します。
このコードはこちら: http://ideone.com/8l0LH.で統っVS2010年、コンパイルに失敗した"モノ"で HashSet<>
できない暗黙的に変換され IEnumerable<>
(なぜですか?).
のアプローチであることは非常に効率的に:で次の入力サイズです。のコンクリートの種類できる効率化:例えば、T=ダブルまでの並べ替え入力配列として O(n log n)
ます。類似のものより複雑なトリックの適用のための2次元ポイントです。
注外最初の提案が可能 IEqualityComparer
, から"近似の平等"では他での平等 IEqualityComparer
きます。