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