List.Contains ne fonctionne pas comme prévu

Si j’ai un object de type MyBull et une List 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(y); 

Par défaut, les objects exposeront une égalité basée sur les références. Si vous souhaitez des règles personnalisées, telles que l’égalité basée sur des champs id, vous devez redéfinir les méthodes Equals et GetHashCode .

Si vous pouvez utiliser LINQ, alors vous pouvez

 class Vessel { public int id { get; set; } public ssortingng name { get; set; } } 

 var vessels = new List() { 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!"); 

En effet, les instances de MyBull sont comparées par référence. Du sharepoint vue de .NET, x et y sont deux instances différentes et ne sont donc pas égales.

Pour IEquatable vous devrez redéfinir les méthodes Equals et GetHashCode (ce qui signifie que vous devriez probablement implémenter IEquatable et redéfinir également les opérateurs == et! =).

Votre object MyBull implémente-t-il IEquatable.Equals ? Cette méthode déterminera l’égalité de deux objects

demandé par OP

Votre classe MyBull implémenterait IEquatable

 public class MyBull : IEquatable 

et alors vous auriez besoin de remplacer la méthode Equals

 public bool Equals(MyBull theOtherMyBull) 

Comme David Neale le mentionne ci-dessous, cette méthode est mieux utilisée lorsque vous comparez des objects du même type – ce que vous êtes. Remplacer Object.Equals et Object.GetHashCode fonctionnera également.