IEquatable<T>.Equals(T) Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Indique si l’objet actuel est égal à un autre objet du même type.
public:
bool Equals(T other);
public bool Equals(T other);
public bool Equals(T? other);
abstract member Equals : 'T -> bool
Public Function Equals (other As T) As Boolean
Paramètres
- other
- T
Objet à comparer à cet objet.
Retours
true si l’objet actuel est égal au other paramètre ; sinon, false.
Exemples
L’exemple suivant montre l’implémentation partielle d’une Person classe qui implémente IEquatable<T> et a deux propriétés, LastName et NationalId.
NationalIdest considéré comme un identificateur unique, par conséquent, la méthode retourne Equals si la True propriété de deux NationalId objets est identique ; sinon, elle retourne Person.False
(Notez que l’exemple F# ne gère pas les null valeurs des Person instances.)
public class Person : IEquatable<Person>
{
public Person(string lastName, string ssn)
{
LastName = lastName;
NationalId = ssn;
}
public string LastName { get; }
public string NationalId { get; }
public bool Equals(Person? other) => other is not null && other.NationalId == NationalId;
public override bool Equals(object? obj) => Equals(obj as Person);
public override int GetHashCode() => NationalId.GetHashCode();
public static bool operator ==(Person person1, Person person2)
{
if (person1 is null)
{
return person2 is null;
}
return person1.Equals(person2);
}
public static bool operator !=(Person person1, Person person2)
{
if (person1 is null)
{
return person2 is not null;
}
return !person1.Equals(person2);
}
}
open System
type Person(lastName: string, nationalId: string) =
member this.LastName = lastName
member this.NationalId = nationalId
interface IEquatable<Person> with
member this.Equals(other: Person) =
other.NationalId = this.NationalId
override this.Equals(obj: obj) =
match obj with
| :? Person as person -> (this :> IEquatable<Person>).Equals(person)
| _ -> false
override this.GetHashCode() =
this.NationalId.GetHashCode()
static member (==) (person1: Person, person2: Person) =
person1.Equals(person2)
static member (!=) (person1: Person, person2: Person) =
not (person1.Equals(person2))
Public Class Person
Implements IEquatable(Of Person)
Public Sub New(lastName As String, nationalId As String)
Me.LastName = lastName
Me.NationalId = nationalId
End Sub
Public ReadOnly Property LastName As String
Public ReadOnly Property NationalId As String
Public Overloads Function Equals(other As Person) As Boolean Implements IEquatable(Of Person).Equals
Return other IsNot Nothing AndAlso other.NationalId = Me.NationalId
End Function
Public Overrides Function Equals(obj As Object) As Boolean
Return Equals(TryCast(obj, Person))
End Function
Public Overrides Function GetHashCode() As Integer
Return NationalId.GetHashCode()
End Function
Public Shared Operator =(person1 As Person, person2 As Person) As Boolean
If person1 Is Nothing Then
Return person2 Is Nothing
End If
Return person1.Equals(person2)
End Operator
Public Shared Operator <>(person1 As Person, person2 As Person) As Boolean
If person1 Is Nothing Then
Return person2 IsNot Nothing
End If
Return Not person1.Equals(person2)
End Operator
End Class
Lorsqu’un Person objet est stocké dans un List<T>, Contains utilise son Equals implémentation pour rechercher une correspondance.
List<Person> applicants = new List<Person>()
{
new Person("Jones", "099-29-4999"),
new Person("Jones", "199-29-3999"),
new Person("Jones", "299-49-6999")
};
// Create a Person object for the final candidate.
Person candidate = new Person("Jones", "199-29-3999");
bool contains = applicants.Contains(candidate);
Console.WriteLine($"{candidate.LastName} ({candidate.NationalId}) is on record: {contains}");
// The example prints the following output:
// Jones (199-29-3999) is on record: True
let applicants =
[ Person("Jones", "099-29-4999")
Person("Jones", "199-29-3999")
Person("Jones", "299-49-6999") ]
let candidate = Person("Jones", "199-29-3999")
let contains = List.contains candidate applicants
printfn "%s (%s) is on record: %b" candidate.LastName candidate.NationalId contains
// The example prints the following output:
// Jones (199-29-3999) is on record: true
Dim applicants As New List(Of Person)
applicants.Add(New Person("Jones", "099-29-4999"))
applicants.Add(New Person("Jones", "199-29-3999"))
applicants.Add(New Person("Jones", "299-49-6999"))
' Create a Person object for the final candidate.
Dim candidate As New Person("Jones", "199-29-3999")
Dim contains As Boolean = applicants.Contains(candidate)
Console.WriteLine($"{candidate.LastName} ({candidate.NationalId}) is on record: {contains}")
' The example prints the following output:
' Jones (199-29-3999) Is on record True
Remarques
L’implémentation de la Equals méthode est destinée à effectuer un test d’égalité avec un autre objet de type T, le même type que l’objet actuel. La Equals(T) méthode est appelée dans les circonstances suivantes :
Lorsque la méthode est appelée et que l’argument
Equalsotherest un objet fortement typé de typeT. (S’ilothern’est pas de typeT, la méthode de base Object.Equals(Object) est appelée. Parmi les deux méthodes, IEquatable<T>.Equals offre des performances légèrement meilleures.)Lorsque les méthodes de recherche d’un certain nombre d’objets de collection générique sont appelées. Voici quelques-uns de ces types et leurs méthodes :
Certaines surcharges génériques de la BinarySearch méthode.
Méthodes de recherche de la List<T> classe, notamment List<T>.Contains(T), , List<T>.IndexOfList<T>.LastIndexOfet List<T>.Remove.
Méthodes de recherche de la Dictionary<TKey,TValue> classe, y compris ContainsKey et Remove.
Méthodes de recherche de la classe générique LinkedList<T> , y compris LinkedList<T>.Contains et Remove.
En d’autres termes, pour gérer la possibilité que les objets d’une classe soient stockés dans un tableau ou un objet de collection générique, il est judicieux d’implémenter IEquatable<T> afin que l’objet puisse être facilement identifié et manipulé.
Lors de l’implémentation de la Equals méthode, définissez l’égalité appropriée pour le type spécifié par l’argument de type générique. Par exemple, si l’argument de type est Int32, définissez l’égalité de manière appropriée pour la comparaison de deux entiers signés 32 bits.
Notes pour les responsables de l’implémentation
Si vous implémentez Equals(T), vous devez également remplacer les implémentations de classe de base et Equals(Object)GetHashCode() pour que leur comportement soit cohérent avec celui de la Equals(T) méthode. Si vous remplacez Equals(Object), votre implémentation substituée est également appelée dans les appels à la méthode statique Equals(System.Object, System.Object) sur votre classe. En outre, vous devez surcharger les opérateurs et op_Equality les op_Inequality opérateurs. Cela garantit que tous les tests d’égalité retournent des résultats cohérents, que l’exemple illustre.