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.
-
Overschrijven van
Equals(object obj):- Vergelijk de huidige instantie met een ander object (
obj) om gelijkheid te controleren. - Zorg dat
objnietnullis. - Zorg dat
objhetzelfde type heeft als de huidige instantie. - Vergelijk de belangrijke velden of eigenschappen van beide objecten.
- Vergelijk de huidige instantie met een ander object (
-
Overschrijven van
GetHashCode():- Genereer een hash-code op basis van dezelfde belangrijke velden of eigenschappen die in
Equalsworden gebruikt. - Zorg dat als
Equalsvoor twee objectentrueteruggeeft, hunGetHashCodemethoden dezelfde waarde teruggeven. - Het is aan te raden om de hash-codes gelijkmatig te verdelen om botsingen te verminderen.
- Genereer een hash-code op basis van dezelfde belangrijke velden of eigenschappen die in
-
Optioneel implementeren van
IEquatable<T>:- Biedt een getypeerde methode
Equals(T other), die efficiënter kan zijn doordat boxing wordt vermeden.
- Biedt een getypeerde methode
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.