La comparaison de deux instances d'une classe
J'ai une classe comme ça
public class TestData
{
public string Name {get;set;}
public string type {get;set;}
public List<string> Members = new List<string>();
public void AddMembers(string[] members)
{
Members.AddRange(members);
}
}
Je veux savoir si il est possible de comparer directement les à des instances de cette classe à l'autre et découvrent qu'ils sont exactement la même chose? quel est le mécanisme? Je suis à la recherche de gor quelque chose comme if(testData1 == testData2) //Do Something
Et si non, comment faire?
OriginalL'auteur Saeid Yazdani | 2011-12-06
Vous devez vous connecter pour publier un commentaire.
Vous devez mettre en œuvre la
IEquatable<T>
interface sur votre classe, ce qui vous permettra de définir vos égalité-logique.En fait, vous devez remplacer le
Equals
méthode.+1 pour une belle réponse, toutefois, de noter que la "substitution de l'opérateur == non immuable types n'est pas recommandé" - voir msdn.microsoft.com/en-us/library/ms173147(v=vs. 80).aspx
Thx, ne le savais pas; je vais l'enlever de ma réponse, car il me semble que c'est vraiment une mutable type. 🙂
Pourquoi ne s' (instance1 == instance2) ne fonctionne pas?
La IComparable<T> interface définit la méthode CompareTo, qui détermine l'ordre de tri des instances du type d'implémentation. Le IEquatable<T> interface définit la méthode Equals, qui détermine l'égalité des instances du type d'implémentation.
OriginalL'auteur Frederik Gheysels
Il y a trois façons d'objets de certains type de référence
T
peuvent être comparés les uns aux autres:de l'objet.Égal à
méthodeIEquatable<T>.Equals
(uniquement pour les types qui implémententIEquatable<T>
)==
En outre, il y a deux possibilités pour chacun de ces cas:
T
(ou une autre base deT
)object
Les règles que vous devez absolument savoir sont:
Equals
etoperator==
est de tester pour la référence à l'égalitéEquals
fonctionne correctement quel que soit le type statique d'objets de comparaison estIEquatable<T>.Equals
doit toujours comporter les mêmes queobject.Equals
, mais si le type statique des objets estT
il offre des performances légèrement meilleuresDonc, quelle est-ce que cela signifie dans la pratique?
Comme une règle générale, vous devriez utiliser
Equals
pour vérifier l'égalité (en ignorantobject.Equals
si nécessaire) et de mettre en œuvreIEquatable<T>
afin de fournir des performances légèrement meilleures. Dans ce casobject.Equals
devraient être mises en œuvre en termes deIEquatable<T>.Equals
.Pour certains types spécifiques (tels que
System.String
), il est également acceptable d'utiliseroperator==
, bien que vous devez être prudent de ne pas faire de "polymorphe des comparaisons". LeEquals
méthodes, d'autre part, fonctionne correctement, même si vous faites de telles comparaisons.Vous pouvez voir un exemple de polymorphe comparaison et pourquoi il peut être un problème ici.
Enfin, n'oubliez jamais que si vous remplacez
object.Equals
vous devez également remplacerobject.GetHashCode
en conséquence.OriginalL'auteur Jon
Une façon de le faire est de mettre en œuvre
IEquatable<T>
Vous pouvez aussi remplacer la Equals(object) méthode (à partir du Système.Objet), si vous faites cela, vous devez également remplacer GetHashCode voir ici
OriginalL'auteur Patrick McDonald
Vous pouvez redéfinir la méthode equals et à l'intérieur de les comparer manuellement les objets
Aussi jeter un oeil à Lignes directrices pour la Surcharge Equals() et Operator ==
OriginalL'auteur Haris Hasan
Vous aurez besoin de définir les règles qui font l'objet d'Un égal à l'objet B, puis remplacer l'opérateur = pour ce type.
http://msdn.microsoft.com/en-us/library/ms173147(v=vs. 80).aspx
OriginalL'auteur DaveRead
Tout d'abord l'égalité est difficile à définir, et vous seul pouvez définir à ce que l'égalité signifie pour vous
Voici une discussion et une réponse ici
Qu'est-ce que les "Meilleures Pratiques" Pour la Comparaison de Deux Instances d'un Type de Référence?
OriginalL'auteur user182630
Mettre en œuvre les
IEquatable<T> interface
. Ceci définit une méthode généralisée qu'une valeur de type ou de classe met en œuvre pour créer un type spécifique de la méthode de détermination de l'égalité des instances. Plus d'informations ici:http://msdn.microsoft.com/en-us/library/ms131187.aspx
OriginalL'auteur Enigma State
Je vois beaucoup de bonnes réponses ici, mais juste au cas où vous souhaitez que la comparaison de travailler comme
au lieu de l'aide est Égal à la fonction, vous pouvez remplacer == et != opérateurs:
OriginalL'auteur roozbeh S