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.
-
Equals(object obj)metodunu geçersiz kılmak:- Mevcut örneği başka bir nesne (
obj) ile karşılaştırmak. obj'innullolmadığı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.
- Mevcut örneği başka bir nesne (
-
GetHashCode()metodunu geçersiz kılmak:Equals'te kullanılan aynı önemli alanlar veya özellikler temel alınarak bir hash kodu üretmek.- Eğer
Equalsiki nesne içintruedöndürüyorsa, onlarınGetHashCodemetodları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.
-
İ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.