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.
-
Sobrescrever
Equals(object obj):- Comparar a instância atual com outro objeto (
obj) para verificar igualdade. - Garantir que
objnão sejanull. - Garantir que
objseja do mesmo tipo que a instância atual. - Comparar os campos ou propriedades relevantes de ambos os objetos.
- Comparar a instância atual com outro objeto (
-
Sobrescrever
GetHashCode():- Gerar um código hash baseado nos mesmos campos ou propriedades relevantes usados em
Equals. - Garantir que, se
Equalsretornartruepara dois objetos, os seus métodosGetHashCoderetornem o mesmo valor. - É aconselhável distribuir uniformemente os códigos hash para reduzir colisões.
- Gerar um código hash baseado nos mesmos campos ou propriedades relevantes usados em
-
Implementar opcionalmente
IEquatable<T>:- Fornece um método tipado
Equals(T other), que pode ser mais eficiente ao evitar boxing para tipos de valor.
- Fornece um método tipado
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.