2016-04-23 5 views
1

Ich habe eine benutzerdefinierte Klasse mit dem Namen City und diese Klasse hat eine Equals Methode. Die SequenceEqual-Methode funktioniert gut, wenn Arrays mit zugewiesenen Variablen verglichen werden. Das Problem tritt auf, wenn zwei Arrays verglichen werden, die die Elemente new City() formatiert enthalten. Es ergibt sich als falsch.Wie überprüft man die Gleichheit für ein benutzerdefiniertes Klassen-Array in C#?

Stadt Klasse:

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; 
    } 
} 

In Test Methode unten, das erste Ergebnis zu vergleichen arrayCompare1true ist und das zweite Ergebnis ist arrayCompare2false. Beide Vergleichsergebnisse müssen wahr sein, aber es gibt eine anormale Untersuchung. Wie kann ich dieses Problem beheben?

Prüfregeln:

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

diese Bedingung ist nutzlos, 'das == null' – CodeNotFound

+0

Vielen Dank für die Antwort @CodeNotFound. Du hast recht. –

Antwort

4

Sie müssen die Object.Equals irgendwie wie diese außer Kraft zu setzen:

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

Ok, es hat funktioniert. Aber die überschriebene "Equals" -Methode wird nicht durch die "IEquatable" -Schnittstelle implementiert und es scheint, dass die "Equals" -Methode, die von der "IEquatable" -Schnittstelle kommt, nicht in Array-Vergleichen verwendet wird. Ich muss sicher sein, dass die Klasse, die von der IGene-Schnittstelle übernommen wurde, die überschriebene Methode "Equals" enthält. Wie kann ich das machen? –

+0

In diesem Fall muss die Klasse IEquateable nicht implementiert werden, sondern eine separate Klasse erstellt werden, die IEqualityComparer implementiert und diesen Vergleich an SequenceEqual übergibt –

2

Sie müssen außer Kraft setzen bool Equals (Objekt obj). Einfachstes Ergänzung zu Ihrem Code:

public override bool Equals(object obj) 
    { 
     return Equals(obj as IGene); 
    } 
Verwandte Themen