Sobes.tech
Middle

Klassni kolleksiyada kalit sifatida ishlatish uchun nima qilish kerak?

sobes.tech AI

AIdan javob

Klassni kolleksiyada (masalan, Dictionary<TKey, TValue> da) kalit sifatida ishlatish uchun, Equals va GetHashCode metodlarini to'g'ri amalga oshirish zarur.

  1. Equals(object obj) ni qayta yozish:

    • Joriy nusxani boshqa ob'ekt (obj) bilan taqqoslash.
    • obj ning null emasligiga ishonch hosil qilish.
    • obj ning joriy nusxaga o'xshash turga ega ekanligini tekshirish.
    • Ikkala ob'ektning muhim maydonlari yoki xususiyatlarini taqqoslash.
  2. GetHashCode() ni qayta yozish:

    • Equals da ishlatiladigan xuddi shu muhim maydonlar yoki xususiyatlar asosida hash kodini yaratish.
    • Agar Equals true qaytaradigan ikki ob'ekt uchun, ularning GetHashCode metodlari ham bir xil qiymatni qaytarishini ta'minlash.
    • Hash kodlarning teng taqsimlanishini ta'minlash tavsiya etiladi, bu koliziyalarni kamaytiradi.
  3. Iste'mol qilish uchun IEquatable<T> ni amalga oshirish:

    • Equals(T other) tipli metodni taqdim etadi, bu boxingni oldini olgan holda, yanada samarali bo'lishi mumkin.

Misol:

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

    // Maydonlar bo'yicha taqqoslash uchun Equals ni qayta yozish
    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;
    }

    // `Equals` da ishlatiladigan maydonlar bilan `GetHashCode` ni qayta yozish
    public override int GetHashCode()
    {
        // Tuple yordamida hash kodlarni birlashtirish
        return (Id, Name).GetHashCode();
    }

    // Iste'mol qilish uchun `IEquatable<T>` ni amalga oshirish
    public bool Equals(MyKey other)
    {
        if (other == null)
        {
            return false;
        }
        return Id == other.Id && Name == other.Name;
    }
}

Agar bu metodlar to'g'ri amalga oshirilmasa, Dictionary standart ravishda identifikatsiya tengligini (referenslarni taqqoslash) va GetHashCode ning standart implementatsiyasini (referensga asoslangan) ishlatadi, bu esa kalitlarni qiymat bo'yicha qidirishda kolleksiyaning noto'g'ri ishlashiga olib kelishi mumkin.