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-ի դեֆոլտ իրականացումը (հղման վրա հիմնված), ինչը կարող է սխալ գործել հավաքածուի որոնումներում արժեքով բանալիներով։