Sobes.tech
Middle

Šta je potrebno uraditi da bi se klasa koristila kao ključ u kolekciji?

sobes.tech АИ

Одговор од АИ

Ако желите да користите клас као кључ у колекцији (на пример, у Dictionary<TKey, TValue>), потребно је правилно имплементирати методе Equals и GetHashCode.

  1. Преоптеретити Equals(object obj):

    • Упоредити тренутни примерак са другим објектом (obj) ради провере једнакости.
    • Уверити се да obj није null.
    • Уверити се да obj има исти тип као и тренутни примерак.
    • Упоредити важна поља или својства оба објекта.
  2. Преоптеретити GetHashCode():

    • Генерисати хеш код на основу истих важних поља или својстава која се користе у Equals.
    • Осигурати да ако Equals враћа true за два објекта, њихове GetHashCode методе враћају исту вредност.
    • Препоручује се равномерна расподела хеш кодова ради смањења колизија.
  3. Опционо имплементирати IEquatable<T>:

    • Обезбеђује типизовану методу Equals(T other), која може бити ефикаснија избегавањем boxing-а за вредносне типове.

Пример:

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

    // Преоптеретити `Equals` за поређење по вредностима
    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;
    }

    // Преоптеретити `GetHashCode` користећи исте поље
    public override int GetHashCode()
    {
        // Користите Tuple за комбиновати хеш кодове
        return (Id, Name).GetHashCode();
    }

    // Опционо имплементирати `IEquatable<T>`
    public bool Equals(MyKey other)
    {
        if (other == null)
        {
            return false;
        }
        return Id == other.Id && Name == other.Name;
    }
}

Без исправне имплементације ових метода, Dictionary ће по подразумевану користити једнакост по идентитету (поређење референци) и подразумевану GetHashCode имплементацију (основану на референци), што може довести до неисправног рада колекције приликом претраге кључева по вредности.