IComparable
працює лише одним способом
Скажімо, у вас Employee
клас. З одного виду, ви хочете показати всі Employees
відсортовані за назвою - в іншому за адресою. Як ти збираєшся цього досягти? Не з IComparable
, принаймні, не в жодному ідіоматичному вигляді.
IComparable
має логіку в неправильному місці
Інтерфейс використовується при виклику .Sort()
. У поданні, яке відображає Customer
сортування за назвою, взагалі немає коду, який би вказував, як він буде сортований.
З іншого боку, Customer
клас припускає, як він буде використовуватися - у цьому випадку він буде використовуватися у списку, відсортованому за іменами.
IComparable
використовується неявно
У порівнянні з альтернативами, дуже важко зрозуміти, де використовується логіка порівняння - чи взагалі. Припускаючи ваш стандартний IDE і починаючи з Customer
класу, мені доведеться це зробити
- Шукати всі посилання на
Customer
- Знайдіть ті посилання, які використовуються у списку
- Перевірте, чи колись ці списки
.Sort()
закликали їх
Що, мабуть, гірше, якщо ви видалите IComparable
реалізацію, яка все ще використовується, ви не отримаєте помилок чи попередження. Єдине, що ви отримаєте - це неправильна поведінка у всіх місцях, які були вам занадто незрозумілими.
Ці питання поєднуються плюс зміни вимог
Сама причина, коли я придумав це, полягає в тому, що це пішло не так. Я з радістю використовую IComparable
у своїй програмі вже 2 роки. Тепер вимоги змінилися і річ потрібно сортувати двома різними способами. Він зауважив, що не весело пройти кроки, описані в попередньому розділі.
Питання
Ці питання змушують мене думати IComparable
як про неповноцінний IComparer
або .OrderBy()
, до того, що я не бачу жодного дійсного випадку використання, який не міг би краще подати альтернативи.
Чи завжди краще використовувати IComparer
або LINQ, або є переваги / випадки використання, яких я тут не бачу?
IComparable
, що підкреслює мою думку.
SortedXXX
колекції, вони або потребують збережених елементів, IComparable
або бути IComparer
наданими. Також зауважте, що тривіально змінити природний порядок сортування одним порівняльником і змусити його працювати з усіма IComparable
об'єктами.
IComparable
вважається механізмом порівняння за замовчуванням . IComparer
використовується, коли ви хочете змінити механізм порівняння за замовчуванням.
ReverseComparer<T>
: gist.github.com/jackfarrington/078e7af7bc82482aa634