Middle
Šta je potrebno uraditi da bi se klasa koristila kao ključ u kolekciji?
sobes.tech АИ
Одговор од АИ
Ако желите да користите клас као кључ у колекцији (на пример, у 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 имплементацију (основану на референци), што може довести до неисправног рада колекције приликом претраге кључева по вредности.