List.contains funktioniert nicht wie erhofft
-
23-10-2019 - |
Frage
Wenn ich ein Objekt vom Typ habe MyBull
und ein List<MyBull> orig
:
// Just an example
MyBull x = getMeTheObjectWithIdFromDB(9);
orig.add(x);
// Again same? data object
MyBull y = getMeTheObjectWithIdFromDB(9);
Warum ist das dann falsch?
// This is false, even though all the properties
// of x and y are the same.
orig.Contains<MyBull>(y);
Lösung
Standardmäßig entlarvt Objekte die referenzbasierte Gleichheit. Wenn Sie benutzerdefinierte Regeln möchten, z. B. Gleichheit basierend auf ID -Feldern, müssen Sie die überschreiben Equals
und GetHashCode
Methoden.
Andere Tipps
Wenn Sie LINQ verwenden können, können Sie
class Vessel
{
public int id { get; set; }
public string name { get; set; }
}
...
var vessels = new List<Vessel>() { new Vessel() { id = 4711, name = "Millennium Falcon" } };
var ship = new Vessel { id = 4711, name = "Millencolin" };
if (vessels.Any(vessel => vessel.id == ship.id))
Console.Write("There can be only one!");
Dies liegt daran, dass die MyBull -Instanzen durch Referenz verglichen werden. Aus der Sicht von .NET, X und Y sind beide verschiedene Fälle und daher nicht gleich.
Um dies umzugehen, müssen Sie Überschreiben Sie die Methoden für Gleiche und Gethashcode (Das heißt, Sie sollten wahrscheinlich implementieren IEquatable<MyBull>
und überschreiben Sie auch die == und! = Operatoren).
Implementiert Ihr MyBull -Objekt IEquatable<T>.Equals
? Diese Methode bestimmt die Gleichheit von zwei Objekten
angefordert von op
Ihre MyBull -Klasse würde iequatable implementieren
public class MyBull : IEquatable<MyBull>
Und dann müssten Sie die überschreiben Equals
Methode
public bool Equals(MyBull theOtherMyBull)
Wie David Neale unten erwähnt, wird dies am besten verwendet, wenn Sie Objekte desselben Typs vergleichenden, die Sie sind. Übergeordnetes Object.equals und Object.GethashCode funktionieren ebenfalls.