Middle
Коллекцияда ачкыч катары классты колдонуу үчүн эмне кылуу керек?
sobes.tech AI
AIден жооп
Эгер сиз классды коллекцияда ачкыч катары колдонгуңуз келсе (мисалы, Dictionary<TKey, TValue>), анда Equals жана GetHashCode методдорун туура ишке ашыруу керек:
-
Equals(object obj)методун override кылуу:- Учурдагы экземплярды башка объект менен салыштыруу:
objнөл эмес экенине ишенүү:objошол эле түрдө экенине ишенүү:- Эки объекттин маанилүү талаалары же мүчөлөрүн салыштыруу:
-
GetHashCode()методун override кылуу:Equalsколдонулган маанилүү талааларга негизделген хэш-кодду түзүү:- Эгер
Equalstrueдеп кайтарса, андаGetHashCodeда бирдей маанини кайтаруусу керек: - Хэш-коддордун жакшы таралышын камсыз кылуу:
-
Ишке ашыруу
IEquatable<T>:Equals(T other)типтелген методду камсыз кылуу, ал көбүрөөк натыйжалуу болушу мүмкүн, анткени бул боксингден качууга жардам берет:
Мисал:
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()
{
return (Id, Name).GetHashCode();
}
// Ишке ашыруу `IEquatable<MyKey>`
public bool Equals(MyKey other)
{
if (other == null)
{
return false;
}
return Id == other.Id && Name == other.Name;
}
}
Эгер бул методдор туура иштебесе, Dictionary негизинен идентичдүүлүк теңдештигин (ссылкаларды салыштыруу) жана GetHashCode стандарттык ишке ашырылышын колдонуп, бул коллекциянын туура эмес иштешине алып келиши мүмкүн.