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

  1. Sobrescribir Equals(object obj):

    • Comparar la instancia actual con otro objeto (obj) para verificar la igualdad.
    • Asegurarse de que obj no sea null.
    • Asegurarse de que obj tenga el mismo tipo que la instancia actual.
    • Comparar los campos o propiedades relevantes de ambos objetos.
  2. Sobrescribir GetHashCode():

    • Generar un código hash basado en los mismos campos o propiedades relevantes utilizados en Equals.
    • Garantizar que si Equals devuelve true para dos objetos, sus métodos GetHashCode devuelvan el mismo valor.
    • Es recomendable distribuir uniformemente los códigos hash para reducir colisiones.
  3. 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.

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.