Es gibt ein paar Möglichkeiten, wie Sie dies tun können. Standardmäßig Equals()
und ==
Prüfung für Referenz Gleichheit, das heißt:
Person a = new Person();
Person b = a:
a.Equals(b); //true
a == b; //true
Und deshalb werden die Objekte für Wertgleichheit nicht verglichen, das heißt:
Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
a.Equals(b); //false
a == b; //false
Um Objekte für ihre Werte vergleichen Sie die überschreiben können Equals()
und GetHashcode()
Methoden, wie folgt aus:
public override bool Equals(System.Object obj)
{
if (obj == null)
return false;
Person p = obj as Person;
if ((System.Object)p == null)
return false;
return (id == p.id) && (name == p.name);
}
public bool Equals(Person p)
{
if ((object)p == null)
return false;
return (id == p.id) && (name == p.name);
}
public override int GetHashCode()
{
return id.GetHashCode()^name.GetHashCode();
}
Jetzt werden Sie andere Ergebnisse sehen bei einem Vergleich:
Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
Person c = a;
a == b; //false
a == c; //true
a.Equals(b); //true
a.Equals(c); //true
Der ==
Betreiber nicht außer Kraft gesetzt wird und daher immer noch tut Referenz Vergleich.
public static bool operator ==(Person a, Person b)
{
if (System.Object.ReferenceEquals(a, b))
return true;
if ((object)a == null || (object)b == null)
return false;
return a.id == b.id && a.name == b.name;
}
public static bool operator !=(Person a, Person b)
{
return !(a == b);
}
nun die Kontrollen laufen ergibt folgende: Dies kann durch Überlastung als auch die !=
Operator gelöst werden
Person a = new Person { id = 1, name = "person1" };
Person b = new Person { id = 1, name = "person1" };
Person c = a;
a == b; //true
a == c; //true
a.Equals(b); //true
a.Equals(c); //true
More reading:
Weitere Informationen zum Implementieren einer benutzerdefinierten GetHashCode-Implementierung finden Sie unter http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode. Warum nicht ReferenceEquals beim Vergleich mit null verwenden und die Besetzung vermeiden? Und sollte der Name Vergleich Groß-und Kleinschreibung beachten? Ich rate nicht, weil der Fall normalerweise nicht wichtig ist, wenn es um Namen geht. – tvanfosson