Sobes.tech
Middle

Какво трябва да се направи, за да се използва клас като ключ в колекция?

sobes.tech AI

Отговор от AI

Ако искате да използвате клас като ключ в колекция (например, в 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 (основана на референция), което може да доведе до неправилна работа на колекцията при търсене на ключове по стойност.