Sobes.tech
Middle

Wat moet er gedaan worden om een klasse als sleutel in een collectie te gebruiken?

sobes.tech AI

Antwoord van AI

Om een klasse als sleutel in een collectie te gebruiken (bijvoorbeeld in Dictionary<TKey, TValue>), is het noodzakelijk om de methoden Equals en GetHashCode correct te implementeren.

  1. Overschrijven van Equals(object obj):

    • Vergelijk de huidige instantie met een ander object (obj) om gelijkheid te controleren.
    • Zorg dat obj niet null is.
    • Zorg dat obj hetzelfde type heeft als de huidige instantie.
    • Vergelijk de belangrijke velden of eigenschappen van beide objecten.
  2. Overschrijven van GetHashCode():

    • Genereer een hash-code op basis van dezelfde belangrijke velden of eigenschappen die in Equals worden gebruikt.
    • Zorg dat als Equals voor twee objecten true teruggeeft, hun GetHashCode methoden dezelfde waarde teruggeven.
    • Het is aan te raden om de hash-codes gelijkmatig te verdelen om botsingen te verminderen.
  3. Optioneel implementeren van IEquatable<T>:

    • Biedt een getypeerde methode Equals(T other), die efficiënter kan zijn doordat boxing wordt vermeden.

Voorbeeld:

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

    // Overschrijven van Equals voor vergelijking op basis van waarden
    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;
    }

    // Overschrijven van GetHashCode met gebruik van dezelfde velden
    public override int GetHashCode()
    {
        // Gebruik maken van Tuple om hashcodes te combineren
        return (Id, Name).GetHashCode();
    }

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

Zonder een juiste implementatie van deze methoden, gebruikt Dictionary standaard de identiteit (referentievergelijking) en de standaard GetHashCode-implementatie (gebaseerd op de referentie), wat kan leiden tot incorrect gedrag bij het zoeken naar sleutels op basis van waarde.