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

  1. 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 obj nav null.
    • Pārliecināties, ka obj ir tāda pati tips kā pašreizējais eksemplārs.
    • Salīdzināt svarīgus laukus vai īpašības abos objektos.
  2. 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 Equals atgriež true diviem objektiem, to GetHashCode metodes atgriež to pašu vērtību.
    • Nodrošināt vienmērīgu hash kodu sadalījumu, lai samazinātu kolīzijas.
  3. 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.

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.