2016-04-23 15 views
1

私はCityという名前のカスタムクラスを持ち、このクラスはEqualsメソッドを持っています。 SequenceEqualメソッドは、配列を割り当てられた変数と比較するときに有効です。この問題は、new City()という形式の要素を含む2つの配列を比較するときに発生します。それは偽となります。C#でカスタムクラス配列の等価性をチェックする方法は?

シティクラス:以下Test方法において

interface IGene : IEquatable<IGene> 
{ 
    string Name { get; set; } 
    int Index { get; set; } 
} 
class City : IGene 
{ 
    string name; 
    int index; 
    public City(string name, int index) 
    { 
     this.name = name; 
     this.index = index; 
    } 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    public int Index 
    { 
     get 
     { 
      return index; 
     } 
     set 
     { 
      index = value; 
     } 
    } 

    public bool Equals(IGene other) 
    { 
     if (other == null && this == null) 
      return true; 
     if((other is City)) 
     { 
      City c = other as City; 
      return c.Name == this.Name && c.Index == this.Index; 
     } 
     return false; 
    } 
} 

、第1比較結果arrayCompare1trueであり、第2の結果arrayCompare2falseあります。どちらの比較結果も真でなければならないが、異常な発言がある。この問題を解決するにはどうすればよいですか?

テストコード:

public void Test() 
{ 
    City c1 = new City("A", 1); 
    City c2 = new City("B", 2); 

    City[] arr1 = new City[] { c1, c2 }; 
    City[] arr2 = new City[] { c1, c2 }; 

    City[] arr3 = new City[] { new City("A", 1), new City("B", 2) }; 
    City[] arr4 = new City[] { new City("A", 1), new City("B", 2) }; 

    bool arrayCompare1 = arr1.SequenceEqual(arr2); 
    bool arrayCompare2 = arr3.SequenceEqual(arr4); 

    MessageBox.Show(arrayCompare1 + " " + arrayCompare2); 
} 
+3

この状態は役に立たない 'this == null' – CodeNotFound

+0

応答@CodeNotFoundに感謝します。あなたが正しい。 –

答えて

4

あなたは何とかこのようなはObject.equalsをオーバーライドする必要があります:

public override bool Equals(object other) 
{ 
    if (other is IGene) 
     return Equals((IGene)other); 
    return base.Equals(other); 
} 
+0

さて、それは働いた。しかし、オーバーライドされた 'Equals'メソッドは' IEquatable'インターフェースによって実装されておらず、 'IEquatable'インターフェースから来た' Equals'メソッドは配列比較で使われないようです。 'IGene'インターフェースから継承したクラスに、オーバーライドされた' Equals'メソッドが含まれていることを確認する必要があります。どうやってやるの? –

+0

その場合、クラスにIEquateableを実装させないで、代わりにIEqualityComparer を実装する別のクラスを作成し、その比較者をSequenceEqualに渡します –

2

あなたはブール等号(オブジェクト OBJ)をオーバーライドする必要があります。あなたのコードに最も簡単に追加:

関連する問題