Sobes.tech
Middle

Ce trebuie făcut pentru a folosi o clasă ca cheie într-o colecție?

sobes.tech AI

Răspuns de la AI

Pentru a utiliza o clasă ca cheie într-o colecție (de exemplu, în Dictionary<TKey, TValue>), este necesar să implementați corect metodele Equals și GetHashCode.

  1. Suprascrieți Equals(object obj):

    • Comparați instanța curentă cu un alt obiect (obj) pentru a verifica egalitatea.
    • Asigurați-vă că obj nu este null.
    • Asigurați-vă că obj are același tip ca și instanța curentă.
    • Comparați câmpurile sau proprietățile relevante ale ambelor obiecte.
  2. Suprascrieți GetHashCode():

    • Generați un cod hash bazat pe aceleași câmpuri sau proprietăți relevante utilizate în Equals.
    • Asigurați-vă că dacă Equals returnează true pentru două obiecte, metodele lor GetHashCode returnează aceeași valoare.
    • Este recomandat să distribuiți uniform codurile hash pentru a reduce coliziunile.
  3. Implementați opțional IEquatable<T>:

    • Oferă o metodă tipizată Equals(T other), care poate fi mai eficientă, evitând boxing-ul pentru tipurile de valoare.

Exemplu:

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;
    }

    // Suprascrieți `Equals` pentru comparație pe valori
    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;
    }

    // Suprascrieți `GetHashCode` folosind aceleași câmpuri
    public override int GetHashCode()
    {
        // Folosiți Tuple pentru combinarea codurilor hash
        return (Id, Name).GetHashCode();
    }

    // Implementați opțional `IEquatable<T>`
    public bool Equals(MyKey other)
    {
        if (other == null)
        {
            return false;
        }
        return Id == other.Id && Name == other.Name;
    }
}

Fără o implementare corectă a acestor metode, Dictionary va folosi implicit egalitatea de identitate (compararea referințelor) și implementarea implicită a GetHashCode (bazată pe referință), ceea ce poate duce la funcționarea incorectă a colecției la căutarea cheilor după valoare.