Назад к вопросам
Middle
164
questionbank

Какие типы данных можно использовать в качестве ключей для словаря (Dictionary) в C#?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Любые типы данных, для которых корректно реализованы методы Equals и GetHashCode.

  • Value types (структуры): По умолчанию реализуют Equals и GetHashCode на основе полей.
  • Reference types (классы): По умолчанию используют сравнение ссылок и хэш-код на основе адреса объекта. Для использования в качестве ключа нужно переопределить Equals и GetHashCode так, чтобы они сравнивали по значению.
  • Immutable types (вроде string): Являются хорошими кандидатами, так как их значение не меняется, что гарантирует постоянство хэш-кода.
// Класс, который можно использовать как ключ, если переопределить Equals и GetHashCode
public class MyKey
{
    public int Id { get; set; }
    public string Name { get; set; }

    public override bool Equals(object obj)
    {
        // Проверка на null и приведение типа
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }

        MyKey other = (MyKey)obj;
        // Сравнение по значению полей
        return (Id == other.Id) && (Name == other.Name);
    }

    public override int GetHashCode()
    {
        // Генерация хэш-кода на основе полей
        // Используем Tuple.GetHashCode() или побитовые операции
        return (Id, Name).GetHashCode();
    }
}