2011-07-14 8 views
1

私はクラス内の2つの変数があるか、2つのクラスが等しいかどうかをチェックしようとしましたが、メッセージボックスは表示されません。クラス内の2つの変数が等しいかどうかをチェックする方法は?

Maptiles:このクラスでは、リストであり、各クラス変数を持つ:ID、X及びY

あるMapIndex:これはmaptilesリスト内のすべてのクラスをループに可変です。

Mapnumberは:

  for (int mapIndex = 0; mapIndex < MapTiles.Count; mapIndex++) 
      { 
       if (mapIndex + mapNumber >= MapTiles.Count) 
       { 
        break; 
       } 
       if(MapTiles[mapIndex].Equals(MapTiles[mapIndex+mapNumber])) 
       { 
        System.Windows.Forms.MessageBox.Show("REMOVE"); 
       } 
       mapNumber++; 
      } 

そこで問題は、それが示すようにする方法、である、または2かどうかを確認する方法:この変数が1に始まり、私はすべてのクラスに

をチェックするためにそれを使用するここでは、コードがありますクラスは同じですか?? Thanx。

+1

でそれを使用して、あなたは彼らが本当に目が等しい(二つの場所で同じオブジェクトである場合には検索したいんe配列)、またはそれらが等価である(異なるID、X、Y値を持つ異なるオブジェクト)? – hatchet

+0

私はmaptiles [0] .X maptiles [0] .Y maptiles [0] .IDがmaptiles [1] .X maptiles [1] .Y maptiles [1] .ID – Marcus

+0

であることを確認する必要があります。以下に示唆されるように、あなた自身のEqualメソッドを – hatchet

答えて

4

あなたのクラスは少なくとも比較のためにObject.Equals()をオーバーライドする必要があります。また、IEquatableを実装することも良い考えです。

詳細情報:Guidelines for Overloading Equals() and Operator == (C# Programming Guide)あなたが他の人に等しい(ともGetHashCodeメソッド)をオーバーライドすることができます言っていることができますよう

1

.NETでもっと自然な方法は、オーバーライドEquals()であり、そのメソッド内のオブジェクトを比較するだけだと思います。

どのような比較の複雑さを実装することもできます。「.NETが期待する方法」で構造化することが重要です。したがって、2年後の誰かが少なくとも物事の論理を理解することができます。

よろしくお願いいたします。

0

しかし、これをしたくない場合、またはできない場合は、IEqualityComparerを実装するクラスを作成できます。

たIEqualityComparerが必要とされていない実装あなたがコレクションにDistinctのようなLINQの式を使用して行くことに決めた場合、それが有用であることが証明さでしょう(あなただけの比較ですがやった方法を書くことができる)が

例えば

class YourImplementedComparer: IEqualityComparer<Item> { 

    public bool Equals(Item x, Item y) { 
     return x.X== y.X && 
      x.Y == y.Y && 
      x.Y == y.Y 
    } 

    public int GetHashCode(Item obj) { 
     return obj.X.GetHashCode()^
      obj.Y.GetHashCode()^
      obj.ID.GetHashCode() ; 
    } 
} 
その後、

明確な

MapTiles = MapTiles.Distinct(new YourImplementedComparer) 
関連する問題