Middle
Ko nepieciešams darīt, lai klases izmantotu kā atslēgu kolekcijā?
sobes.tech AI
Atbilde no AI
Ja vēlaties izmantot klasi kā atslēgu kolekcijā (piemēram, Dictionary<TKey, TValue>), ir nepieciešams pareizi ieviest Equals un GetHashCode metodes:
-
Pārdefinēt
Equals(object obj):- Salīdzināt pašreizējo eksemplāru ar citu objektu (
obj) par vienādību. - Pārliecināties, ka
objnavnull. - Pārliecināties, ka
objir tāda pati tips kā pašreizējais eksemplārs. - Salīdzināt svarīgus laukus vai īpašības abos objektos.
- Salīdzināt pašreizējo eksemplāru ar citu objektu (
-
Pārdefinēt
GetHashCode():- Ģenerēt hash kodu, balstoties uz tiem pašiem svarīgajiem laukiem vai īpašībām, kas tiek izmantotas
Equals. - Nodrošināt, ka, ja
Equalsatgriežtruediviem objektiem, toGetHashCodemetodes atgriež to pašu vērtību. - Nodrošināt vienmērīgu hash kodu sadalījumu, lai samazinātu kolīzijas.
- Ģenerēt hash kodu, balstoties uz tiem pašiem svarīgajiem laukiem vai īpašībām, kas tiek izmantotas
-
Neobligāti ieviest
IEquatable<T>:- Nodrošina tipizētu
Equals(T other)metodi, kas var būt efektīvāka, izvairoties no boxing (iepakošanas) vērtību tipiem.
- Nodrošina tipizētu
Piemērs:
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;
}
// Pārdefinēt `Equals` pēc vērtībām
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;
}
// Pārdefinēt `GetHashCode`, izmantojot tās pašas īpašības
public override int GetHashCode()
{
return (Id, Name).GetHashCode();
}
// Neobligāti ieviest `IEquatable<MyKey>`
public bool Equals(MyKey other)
{
if (other == null)
{
return false;
}
return Id == other.Id && Name == other.Name;
}
}
Bez pareizas šo metožu īstenošanas Dictionary pēc noklusējuma izmantos identitātes vienādību (saiteņu salīdzinājumu) un noklusējuma GetHashCode īstenojumu (balstītu uz saiti), kas var novest pie nepareizas kolekcijas darbības, meklējot atslēgas pēc vērtības.