Middle
Какво трябва да се направи, за да се използва клас като ключ в колекция?
sobes.tech AI
Отговор от AI
Ако искате да използвате клас като ключ в колекция (например, в 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 (основана на референция), което може да доведе до неправилна работа на колекцията при търсене на ключове по стойност.