Question

Si j'ai un objet de type MyBull et un List<MyBull> orig:

// Just an example
MyBull x = getMeTheObjectWithIdFromDB(9);

orig.add(x);

// Again same? data object
MyBull y = getMeTheObjectWithIdFromDB(9);

Pourquoi est-ce faux alors?

// This is false, even though all the properties
// of x and y are the same.
orig.Contains<MyBull>(y); 
Était-ce utile?

La solution

Par objets par défaut exposera l'égalité sur la base de référence. Si vous voulez des règles personnalisées, telles que l'égalité basée sur les champs d'identification, vous devez remplacer les méthodes de Equals et GetHashCode.

Autres conseils

Si vous pouvez utiliser LINQ alors vous pouvez

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!");

Ceci est parce que les cas MyBull sont comparés par référence. Du point de vue de .NET, x et y sont à la fois différentes instances et donc pas égaux.

Pour contourner cela, vous devrez remplacer les méthodes equals et (GetHashCode qui signifie que vous devez mettre en œuvre probablement IEquatable<MyBull> et remplacer le == et! = trop).

Votre objet MyBull mettre en œuvre IEquatable<T>.Equals? Cette méthode permettra de déterminer l'égalité de deux objets

demandé par OP

Votre classe MyBull mettrait en œuvre IEquatable

public class MyBull : IEquatable<MyBull>

et alors vous devrez remplacer la méthode Equals

public bool Equals(MyBull theOtherMyBull)

Comme David Neale mentionne ci-dessous, cela est préférable d'utiliser lorsque vous comparez des objets du même type - que vous êtes. Redéfinition Object.Equals et Object.GetHashCode fonctionnera aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top