Middle
Ką reikia padaryti, kad klasė būtų naudojama kaip raktas kolekcijoje?
sobes.tech AI
Atsakymas iš AI
Jei norite naudoti klasę kaip raktą kolekcijoje (pavyzdžiui, Dictionary<TKey, TValue>), būtina teisingai įgyvendinti Equals ir GetHashCode metodus:
-
Perrašyti
Equals(object obj):- Palyginti esamą egzempliorių su kitu objektu (
obj) dėl lygybės. - Įsitikinti, kad
objnėranull. - Įsitikinti, kad
objturi tą patį tipą kaip ir esamas egzempliorius. - Palyginti svarbius laukus arba savybes abiejuose objektuose.
- Palyginti esamą egzempliorių su kitu objektu (
-
Perrašyti
GetHashCode():- Sugeneruoti žemės ūkio kodą remiantis tais pačiais svarbiais laukais ar savybėmis, kaip ir
Equals. - Užtikrinti, kad jei
Equalsgrąžinatruedviems objektams, jųGetHashCodemetodai grąžina tą patį reikšmę. - Svarbu užtikrinti tolygų žemės ūkio kodų paskirstymą, siekiant sumažinti kolizijas.
- Sugeneruoti žemės ūkio kodą remiantis tais pačiais svarbiais laukais ar savybėmis, kaip ir
-
Pasirinktinai įgyvendinti
IEquatable<T>:- Suteikia tipizuotą
Equals(T other)metodą, kuris gali būti efektyvesnis, išvengiant boxing (kapsuliavimo) reikšmių tipų.
- Suteikia tipizuotą
Pavyzdys:
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;
}
// Perrašyti `Equals` pagal reikšmes
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;
}
// Perrašyti `GetHashCode`, naudojant tas pačias savybes
public override int GetHashCode()
{
return (Id, Name).GetHashCode();
}
// Pasirinktinai įgyvendinti `IEquatable<MyKey>`
public bool Equals(MyKey other)
{
if (other == null)
{
return false;
}
return Id == other.Id && Name == other.Name;
}
}
Be šių metodų teisingo įgyvendinimo Dictionary pagal numatytuosius nustatymus naudos identiteto lygybę (nuorodų palyginimą) ir GetHashCode numatytąją implementaciją (nuoroda pagrįstą), kas gali sukelti netinkamą kolekcijos veikimą ieškant raktų pagal reikšmę.