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.
-
Equals(object obj)ni qayta yozish:- Joriy nusxani boshqa ob'ekt (
obj) bilan taqqoslash. objningnullemasligiga ishonch hosil qilish.objning joriy nusxaga o'xshash turga ega ekanligini tekshirish.- Ikkala ob'ektning muhim maydonlari yoki xususiyatlarini taqqoslash.
- Joriy nusxani boshqa ob'ekt (
-
GetHashCode()ni qayta yozish:Equalsda ishlatiladigan xuddi shu muhim maydonlar yoki xususiyatlar asosida hash kodini yaratish.- Agar
Equalstrueqaytaradigan ikki ob'ekt uchun, ularningGetHashCodemetodlari ham bir xil qiymatni qaytarishini ta'minlash. - Hash kodlarning teng taqsimlanishini ta'minlash tavsiya etiladi, bu koliziyalarni kamaytiradi.
-
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.