Middle
¿Qué se necesita hacer para usar una clase como clave en una colección?
sobes.tech AI
Respuesta de la IA
Para usar una clase como clave en una colección (por ejemplo, en Dictionary<TKey, TValue>), es necesario implementar correctamente los métodos Equals y GetHashCode.
-
Sobrescribir
Equals(object obj):- Comparar la instancia actual con otro objeto (
obj) para verificar la igualdad. - Asegurarse de que
objno seanull. - Asegurarse de que
objtenga el mismo tipo que la instancia actual. - Comparar los campos o propiedades relevantes de ambos objetos.
- Comparar la instancia actual con otro objeto (
-
Sobrescribir
GetHashCode():- Generar un código hash basado en los mismos campos o propiedades relevantes utilizados en
Equals. - Garantizar que si
Equalsdevuelvetruepara dos objetos, sus métodosGetHashCodedevuelvan el mismo valor. - Es recomendable distribuir uniformemente los códigos hash para reducir colisiones.
- Generar un código hash basado en los mismos campos o propiedades relevantes utilizados en
-
Implementar opcionalmente
IEquatable<T>:- Proporciona un método tipado
Equals(T other), que puede ser más eficiente al evitar boxing para tipos de valor.
- Proporciona un método tipado
Ejemplo:
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;
}
// Sobrescribir Equals para comparación por valores de campos
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;
}
// Sobrescribir GetHashCode usando los mismos campos
public override int GetHashCode()
{
// Usar Tuple para combinar los 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;
}
}
Sin la implementación correcta de estos métodos, por defecto Dictionary usará igualdad por identidad (comparación de referencias) y una implementación predeterminada de GetHashCode (basada en la referencia), lo que puede causar un funcionamiento incorrecto de la colección al buscar claves por valor.