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); 
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top