Рекомендации по использованию IDictionary (.NET)

Я считаю, что классы IDictionary лучше работают с сортируемыми объектами. Я также считаю, что интерфейс IComparer необходим для сортировки объектов из класса. Я также прочитал в MSDN, что когда вы реализуете IComparable, вам нужно будет переопределить метод Equals (и GetHashCode по расширению, как я полагаю).

У меня есть три сомнения:

1) Любое из вышеперечисленных предположений неверно?

2) Когда я буду внедрять IComparer, мне придется следовать тем же рекомендациям IComparable?

3) Когда я переопределяю метод Equals, мне придется переопределить оператор ==, или верно только обратное?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
857
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

(Я исключил из этого универсальные шаблоны - те же принципы действуют для общих и неуниверсальных форм. Неуниверсального интерфейса IEquatable нет, поскольку в System.Object уже есть соответствующие методы.)

Чтобы объекты можно было использовать в качестве ключей IDictionary, необязательно их сортировать. Однако они должны иметь разумный хэш-код и реализацию равенства.

Если вы не используете словарь, который на самом деле сортирует ключи, вас должны больше интересовать IEqualityComparer<T> и IEquatable<T> - вам не нужно иметь возможность сказать, что один объект больше или меньше другого, независимо от того, являются они или нет равно и каков хэш-код одного объекта (в соответствии с Equals).

Реализация IEquatable аналогична реализации IComparable - это означает, что объект может сравнивать сам с другим объектом указанного типа (обычно того же типа). Хотя вы не можете использовать имеют для переопределения Equals (object) для реализации IEquatable, это настоятельно рекомендуется.

Реализация IEqualityComparer похожа на реализацию IComparer - вместо сравнения «этого» объекта с другим, метод Equals / Compare принимает значения два для сравнения. Реализации IEqualityComparer / IComparer редко переопределяют object.GetHashCode или object.Equals, если только они не хотят позволить сравнения компараторов - редко полезно.

Для вашего третьего момента: переопределение Equals, конечно, не заставляет вас перегрузить == (вы не можете переопределять операторы, только перегрузите их). Вы можете выбрать, хотите ли вы это сделать.

Другие вопросы по теме