Sobes.tech
Middle

Mida tuleb teha, et klassi kasutada võtmena kogumis?

sobes.tech AI

Vastus AI-lt

Kui soovite kasutada klassi võtmena kogumis (näiteks Dictionary<TKey, TValue>), on oluline õigesti rakendada Equals ja GetHashCode meetodid:

  1. Overrideda Equals(object obj):

    • Võrrelda praegust eksemplari teise objektiga (obj) võrdluseks.
    • Veenduda, et obj ei ole null.
    • Veenduda, et obj on sama tüüpi kui praegune eksemplar.
    • Võrrelda mõjukamaid välju või omadusi mõlemas objektis.
  2. Overrideda GetHashCode():

    • Genereerida hash-kood samade oluliste väljade või omaduste põhjal, mis on kasutusel Equals-is.
    • Tagada, et kui Equals tagastab true kahe objekti jaoks, siis nende GetHashCode meetodid tagastavad sama väärtuse.
    • Tagada ühtlane hash-koodide jaotus, et vähendada kokkupõrkeid.
  3. Valikuliselt rakendada IEquatable<T>:

    • Pakkuda tüüpilist Equals(T other) meetodit, mis võib olla tõhusam, vältides boxingut väärtustüüpide puhul.

Näide:

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;
    }

    // Overrideda `Equals` väärtuste võrdluseks
    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;
    }

    // Overrideda `GetHashCode`, kasutades samu välju
    public override int GetHashCode()
    {
        return (Id, Name).GetHashCode();
    }

    // Valikuliselt rakendada `IEquatable<MyKey>`
    public bool Equals(MyKey other)
    {
        if (other == null)
        {
            return false;
        }
        return Id == other.Id && Name == other.Name;
    }
}

Ilma nende meetodite õige rakendamiseta kasutab Dictionary vaikimisi identiteedi võrdlust (viitide võrdlus) ja GetHashCode vaikimisi rakendust (viidil põhinev), mis võib põhjustada kole kole kogumise ebatäpset tööd väärtuse järgi otsimisel.