Sobes.tech
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.

  1. Redéfinir Equals(object obj) :

    • Comparer l’instance courante avec un autre objet (obj) pour vérifier l’égalité.
    • S’assurer que obj n’est pas null.
    • S’assurer que obj a le même type que l’instance courante.
    • Comparer les champs ou propriétés importants des deux objets.
  2. 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 Equals retourne true pour deux objets, leurs méthodes GetHashCode retournent la même valeur.
    • Il est conseillé de répartir uniformément les codes de hachage pour réduire les collisions.
  3. 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.

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.