質問

この質問は はこちら.

しか 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
}

論文 ありませんの実施 EqualsGetHashCode お客様のご要望に合わせて、.

証明: 次の三つのポイントA、B、C:

Illustration

として、貴社の要件

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)

以降 EqualsGetHashCode は異なる値と同じ引数が実施お客様のご要望に合わせて、.q.e.d.

他のヒント

いと思うのですが、無限の列の値が等しい(以内の公差)の前後の値の配列がないその他の価値 GetHashCode うを返す必要が同一の値を全員について記入してください。

でもその答えに基づきグリッドがもうけられることがありまめグループのポイントとにかくない場合でも、同じ系統の細胞。私のアプローチを継続して実施することの分類:二点は同じグループのいずれかでありまたは列のポイントに接続します。この意味はできません正しく IEqualityComparer, でのニーズを知る全ての項目を事前に生産します。いう単純なLINQ-スタイルオペレーター GroupByCluster, 基本的には実現します。

このコードはこちら: http://ideone.com/8l0LH.で統っVS2010年、コンパイルに失敗した"モノ"で HashSet<> できない暗黙的に変換され IEnumerable<> (なぜですか?).

のアプローチであることは非常に効率的に:で次の入力サイズです。のコンクリートの種類できる効率化:例えば、T=ダブルまでの並べ替え入力配列として O(n log n) ます。類似のものより複雑なトリックの適用のための2次元ポイントです。


注外最初の提案が可能 IEqualityComparer, から"近似の平等"では他での平等 IEqualityComparer きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top