Middle
Ce trebuie făcut pentru a folosi o clasă ca cheie într-o colecție?
sobes.tech AI
Răspuns de la AI
Pentru a utiliza o clasă ca cheie într-o colecție (de exemplu, în Dictionary<TKey, TValue>), este necesar să implementați corect metodele Equals și GetHashCode.
-
Suprascrieți
Equals(object obj):- Comparați instanța curentă cu un alt obiect (
obj) pentru a verifica egalitatea. - Asigurați-vă că
objnu estenull. - Asigurați-vă că
objare același tip ca și instanța curentă. - Comparați câmpurile sau proprietățile relevante ale ambelor obiecte.
- Comparați instanța curentă cu un alt obiect (
-
Suprascrieți
GetHashCode():- Generați un cod hash bazat pe aceleași câmpuri sau proprietăți relevante utilizate în
Equals. - Asigurați-vă că dacă
Equalsreturneazătruepentru două obiecte, metodele lorGetHashCodereturnează aceeași valoare. - Este recomandat să distribuiți uniform codurile hash pentru a reduce coliziunile.
- Generați un cod hash bazat pe aceleași câmpuri sau proprietăți relevante utilizate în
-
Implementați opțional
IEquatable<T>:- Oferă o metodă tipizată
Equals(T other), care poate fi mai eficientă, evitând boxing-ul pentru tipurile de valoare.
- Oferă o metodă tipizată
Exemplu:
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;
}
// Suprascrieți `Equals` pentru comparație pe valori
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;
}
// Suprascrieți `GetHashCode` folosind aceleași câmpuri
public override int GetHashCode()
{
// Folosiți Tuple pentru combinarea codurilor hash
return (Id, Name).GetHashCode();
}
// Implementați opțional `IEquatable<T>`
public bool Equals(MyKey other)
{
if (other == null)
{
return false;
}
return Id == other.Id && Name == other.Name;
}
}
Fără o implementare corectă a acestor metode, Dictionary va folosi implicit egalitatea de identitate (compararea referințelor) și implementarea implicită a GetHashCode (bazată pe referință), ceea ce poate duce la funcționarea incorectă a colecției la căutarea cheilor după valoare.