Sobes.tech
Middle

O que é necessário fazer para usar uma classe como chave numa coleção?

sobes.tech IA

Resposta da IA

Para usar uma classe como chave numa coleção (por exemplo, em Dictionary<TKey, TValue>), é necessário implementar corretamente os métodos Equals e GetHashCode.

  1. Sobrescrever Equals(object obj):

    • Comparar a instância atual com outro objeto (obj) para verificar igualdade.
    • Garantir que obj não seja null.
    • Garantir que obj seja do mesmo tipo que a instância atual.
    • Comparar os campos ou propriedades relevantes de ambos os objetos.
  2. Sobrescrever GetHashCode():

    • Gerar um código hash baseado nos mesmos campos ou propriedades relevantes usados em Equals.
    • Garantir que, se Equals retornar true para dois objetos, os seus métodos GetHashCode retornem o mesmo valor.
    • É aconselhável distribuir uniformemente os códigos hash para reduzir colisões.
  3. Implementar opcionalmente IEquatable<T>:

    • Fornece um método tipado Equals(T other), que pode ser mais eficiente ao evitar boxing para tipos de valor.

Exemplo:

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

    // Sobrescrever Equals para comparação por valores
    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;
    }

    // Sobrescrever GetHashCode usando os mesmos campos
    public override int GetHashCode()
    {
        // Usar Tuple para combinar os códigos hash
        return (Id, Name).GetHashCode();
    }

    // Opcionalmente implementar IEquatable<T>
    public bool Equals(MyKey other)
    {
        if (other == null)
        {
            return false;
        }
        return Id == other.Id && Name == other.Name;
    }
}

Sem a implementação correta desses métodos, por padrão, o Dictionary usará a igualdade de identidade (comparação de referências) e a implementação padrão de GetHashCode (baseada na referência), o que pode levar a um funcionamento incorreto da coleção ao procurar chaves por valor.