Middle
რა უნდა გაკეთდეს, რათა კლასი გამოიყენოს კოლექციაში გასაღებად?
sobes.tech AI
პასუხი AI-სგან
Եթե ցանկանում եք օգտագործել դասը որպես բանալի հավաքածուում (օրինակ Dictionary<TKey, TValue>), անհրաժեշտ է ճիշտ իրականացնել Equals և GetHashCode մեթոդները:
-
Ավելացնել
Equals(object obj):- Համեմատել ընթացիկ օրինակն այլ օբյեկտի (
obj) հետ հավասարության համար: - Համոզվել, որ
objչի լինիnull: - Համոզվել, որ
objունի նույն տիպը, ինչ ընթացիկ օրինակն է: - Համեմատել երկու օբյեկտների կարևոր դաշտերը կամ հատկությունները:
- Համեմատել ընթացիկ օրինակն այլ օբյեկտի (
-
Ավելացնել
GetHashCode():- Գեներացնել հեշ-կոդը նույն կարևոր դաշտերի կամ հատկությունների հիման վրա, ինչ
Equals-ում: - Համոզվել, որ եթե
Equals-ը վերադարձնում էtrueերկու օբյեկտների համար, ապա նրանցGetHashCodeմեթոդները վերադարձնում են նույն արժեքը: - Լավ է ապահովել հեշ-կոդերի հավասարաչափ բաշխում, որպեսզի նվազեցվի բախումների քանակը:
- Գեներացնել հեշ-կոդը նույն կարևոր դաշտերի կամ հատկությունների հիման վրա, ինչ
-
Ընտրովի
իրականացնել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-ի դեֆոլտ իրականացումը (հղման վրա հիմնված), ինչը կարող է սխալ գործել հավաքածուի որոնումներում արժեքով բանալիներով։