Middle
Que faut-il faire pour utiliser une classe comme clé dans une collection?
sobes.tech IA
Réponse de l'IA
Pour utiliser une classe comme clé dans une collection (par exemple, dans Dictionary<TKey, TValue>), il est nécessaire d’implémenter correctement les méthodes Equals et GetHashCode.
-
Redéfinir
Equals(object obj):- Comparer l’instance courante avec un autre objet (
obj) pour vérifier l’égalité. - S’assurer que
objn’est pasnull. - S’assurer que
obja le même type que l’instance courante. - Comparer les champs ou propriétés importants des deux objets.
- Comparer l’instance courante avec un autre objet (
-
Redéfinir
GetHashCode():- Générer un code de hachage basé sur les mêmes champs ou propriétés importants utilisés dans
Equals. - Garantir que si
Equalsretournetruepour deux objets, leurs méthodesGetHashCoderetournent la même valeur. - Il est conseillé de répartir uniformément les codes de hachage pour réduire les collisions.
- Générer un code de hachage basé sur les mêmes champs ou propriétés importants utilisés dans
-
Implémentation optionnelle de
IEquatable<T>:- Fournit une méthode typée
Equals(T other), qui peut être plus performante en évitant le boxing pour les types valeur.
- Fournit une méthode typée
Exemple :
using System;
using System.Collections.Generic;
public class MyKey
{
public int Id { get; }
public string Name { get; }
public MyKey(int id, string name)
{
Id = id;
Name = name;
}
// Redéfinir Equals pour la comparaison par valeurs
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
MyKey other = (MyKey)obj;
return Id == other.Id && Name == other.Name;
}
// Redéfinir GetHashCode en utilisant les mêmes champs
public override int GetHashCode()
{
// Utiliser Tuple pour combiner les codes de hachage
return (Id, Name).GetHashCode();
}
// Implémentation optionnelle de IEquatable<T>
public bool Equals(MyKey other)
{
if (other == null)
{
return false;
}
return Id == other.Id && Name == other.Name;
}
}
Sans une implémentation correcte de ces méthodes, Dictionary utilisera par défaut l’égalité d’identité (comparaison de références) et une implémentation par défaut de GetHashCode (basée sur la référence), ce qui peut entraîner un comportement incorrect de la collection lors de la recherche de clés par valeur.