Sobes.tech
Middle

Bir sınıfı koleksiyonda anahtar olarak kullanmak için ne yapılmalı?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bir sınıfı koleksiyonda anahtar olarak kullanmak (örneğin, Dictionary<TKey, TValue> içinde), Equals ve GetHashCode metodlarını doğru şekilde uygulamak gerekir.

  1. Equals(object obj) metodunu geçersiz kılmak:

    • Mevcut örneği başka bir nesne (obj) ile karşılaştırmak.
    • obj'in null olmadığından emin olmak.
    • obj'in, mevcut örneğin aynı türe sahip olduğunu doğrulamak.
    • Her iki nesnenin önemli alanlarını veya özelliklerini karşılaştırmak.
  2. GetHashCode() metodunu geçersiz kılmak:

    • Equals'te kullanılan aynı önemli alanlar veya özellikler temel alınarak bir hash kodu üretmek.
    • Eğer Equals iki nesne için true döndürüyorsa, onların GetHashCode metodlarının aynı değeri döndürdüğünden emin olmak.
    • Çakışmaları azaltmak için hash kodlarının düzgün dağılımını sağlamak önerilir.
  3. İsteğe bağlı olarak IEquatable<T>'yi uygulamak:

    • Equals(T other) adlı tiplenmiş bir metod sağlar, bu da boxing'i önleyerek daha verimli olabilir.

Örnek:

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

    // Değerler üzerinden karşılaştırma için Equals metodunu geçersiz kılmak
    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;
    }

    // Aynı alanlar kullanılarak GetHashCode'u geçersiz kılmak
    public override int GetHashCode()
    {
        // Tuple kullanarak hash kodlarını birleştiriyoruz
        return (Id, Name).GetHashCode();
    }

    // İsteğe bağlı olarak IEquatable<T> uygulaması
    public bool Equals(MyKey other)
    {
        if (other == null)
        {
            return false;
        }
        return Id == other.Id && Name == other.Name;
    }
}

Bu metodların doğru şekilde uygulanmaması durumunda, Dictionary varsayılan olarak kimlik eşitliğini (referans karşılaştırması) ve varsayılan GetHashCode uygulamasını (referansa dayalı) kullanacaktır, bu da anahtarların değerine göre arama yaparken koleksiyonun düzgün çalışmamasına neden olabilir.