Die einzige Möglichkeit, die Sie wirklich tun können, besteht darin, bool Object.Equals(object other)
außer Kraft zu setzen, um wahr zurückzugeben, wenn Ihre Bedingungen für die Gleichheit erfüllt sind, und andernfalls false zurückzugeben. Sie müssen auch int Object.GetHashCode()
außer Kraft setzen, um einen von berechneten Wert der Daten zurückgeben, die Sie beim Überschreiben berücksichtigen Equals()
.
Als Nebenbemerkung beachten Sie, dass der Vertrag für GetHashCode()
angibt, dass der Rückgabewert für zwei Objekte gleich sein muss, wenn Equals()
beim Vergleich True zurückgegeben wird. Dies bedeutet, dass return 0;
eine gültige Implementierung von GetHashCode()
ist, aber es führt zu Ineffizienzen, wenn Objekte Ihrer Klasse als Wörterbuchschlüssel verwendet oder in einer HashSet<T>
gespeichert werden.
So wie ich Gleichheit implementieren ist wie folgt:
public class Foo : IEquatable<Foo>
{
public bool Equals(Foo other)
{
if (other == null)
return false;
if (other == this)
return true; // Same object reference.
// Compare this to other and return true/false as appropriate.
}
public override bool Equals(Object other)
{
return Equals(other as Foo);
}
public override int GetHashCode()
{
// Compute and return hash code.
}
}
Ein einfacher Weg GetHashCode()
der Implementierung besteht darin, die Hash-Codes aller Daten, die Sie in Equals()
für Gleichheit betrachten XOR. Wenn also zum Beispiel die Eigenschaften, die Sie für die Gleichstellung vergleichen string FirstName; string LastName; int Id;
sind, können Sie Ihre Implementierung wie folgt aussehen:
public override int GetHashCode()
{
return (FirstName != null ? FirstName.GetHashCode() : 0)^
(LastName != null ? LastName.GetHashCode() : 0)^
Id; // Primitives of <= 4 bytes are their own hash codes
}
ich in der Regel nicht haben Vorrang vor den Gleichheitsoperatoren, wie die meiste Zeit ich bin besorgt darüber, mit Gleichheit nur für die Zwecke von Wörterbuchschlüsseln oder Sammlungen. Ich würde nur in Betracht ziehen, die Gleichheitsoperatoren zu überschreiben, wenn Sie wahrscheinlich mehr Vergleiche nach Wert als nach Verweis durchführen, da es syntaktisch weniger ausführlich ist. Sie müssen jedoch daran denken, alle Stellen zu ändern, an denen Sie ==
oder !=
für Ihr Objekt (einschließlich Ihrer Implementierung von Equals()
!) Verwenden, um Object.ReferenceEquals()
zu verwenden oder beide Operanden in object
zu konvertieren. Dieses fiese gotcha (das endlose Rekursion in Ihrem Gleichheitstest verursachen kann, wenn Sie nicht aufpassen) ist einer der Hauptgründe, die ich selten diese Operatoren überschreibe.
Wie lauten Ihre Bedingungen für die Gleichheit der Objekte? – BoltClock
Grundsätzlich sollten alle Werte in diesen String-Membern, Double-Membern und dem/den Array (s) übereinstimmen! – siva
möglich duplizieren von http://StackOverflow.com/Questions/506096/ComparingObject-Properties-in-C – RameshVel