Sobes.tech
Middle

Klassı kolleksiyada açar kimi istifadə etmək üçün nə etmək lazımdır?

sobes.tech Süni İntellekt

AI-dan cavab

Klassı kolleksiyada (məsələn, Dictionary<TKey, TValue> içində) açar kimi istifadə etmək üçün, EqualsGetHashCode metodlarını düzgün şəkildə həyata keçirmək lazımdır.

  1. Equals(object obj) metodunu yenidən yazmaq:

    • Cari nümunəni başqa bir obyekt (obj) ilə müqayisə etmək.
    • obj-in null olmadığından əmin olmaq.
    • obj-in cari nümunə ilə eyni tiplə olduğunu yoxlamaq.
    • Hər iki obyektin vacib sahələrini və ya xüsusiyyətlərini müqayisə etmək.
  2. GetHashCode() metodunu yenidən yazmaq:

    • Equals-də istifadə olunan eyni vacib sahələr və ya xüsusiyyətlər əsasında hash kodu yaratmaq.
    • Əgər Equals iki obyekt üçün true qaytarırsa, onların GetHashCode metodlarının eyni dəyəri qaytardığından əmin olmaq.
    • Hash kodlarının bərabər paylanmasını təmin etmək tövsiyə olunur, bu da toqquşmaları azaldır.
  3. İstəyə bağlı olaraq IEquatable<T>-i həyata keçirmək:

    • Equals(T other) tipli metod təqdim edir, bu da boxing-i qarşısını alaraq daha səmərəli ola bilər.

Nümunə:

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

    // Dəyərlər əsasında müqayisə üçün Equals metodunu yenidən yazmaq
    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`-də istifadə olunan sahələrdən istifadə edərək GetHashCode-u yenidən yazmaq
    public override int GetHashCode()
    {
        // Tuple istifadə edərək hash kodlarını birləşdiririk
        return (Id, Name).GetHashCode();
    }

    // İstəyə bağlı olaraq IEquatable<T> tətbiqi
    public bool Equals(MyKey other)
    {
        if (other == null)
        {
            return false;
        }
        return Id == other.Id && Name == other.Name;
    }
}

Bu metodların düzgün şəkildə həyata keçirilməməsi halında, Dictionary standart olaraq identiklik bərabərliyini (referansların müqayisəsi) və GetHashCode-un standart tətbiqini (referansa əsaslanan) istifadə edəcək, bu da açarların dəyərə görə axtarışında kolleksiyanın düzgün işləməməsinə səbəb ola bilər.