Sobes.tech
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:

  1. Perrašyti Equals(object obj):

    • Palyginti esamą egzempliorių su kitu objektu (obj) dėl lygybės.
    • Įsitikinti, kad obj nėra null.
    • Įsitikinti, kad obj turi tą patį tipą kaip ir esamas egzempliorius.
    • Palyginti svarbius laukus arba savybes abiejuose objektuose.
  2. Perrašyti GetHashCode():

    • Sugeneruoti žemės ūkio kodą remiantis tais pačiais svarbiais laukais ar savybėmis, kaip ir Equals.
    • Užtikrinti, kad jei Equals grąžina true dviems objektams, jų GetHashCode metodai grąžina tą patį reikšmę.
    • Svarbu užtikrinti tolygų žemės ūkio kodų paskirstymą, siekiant sumažinti kolizijas.
  3. Pasirinktinai įgyvendinti IEquatable<T>:

    • Suteikia tipizuotą Equals(T other) metodą, kuris gali būti efektyvesnis, išvengiant boxing (kapsuliavimo) reikšmių tipų.

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ę.