И тот и другой интерфейс были созданы для сравнения элементов. При этом оба почему-то имеют право на существование.
Поясните раз и навсегда, когда стоит выбирать один, а когда другой, и есть ли какая-то разница между ними?
И тот и другой интерфейс были созданы для сравнения элементов. При этом оба почему-то имеют право на существование.
Поясните раз и навсегда, когда стоит выбирать один, а когда другой, и есть ли какая-то разница между ними?
По сути интерфейсы идентичны. И там и там есть метод сравнения, который работает по одной схеме : сравнивает элементы путём вычитания одного из другого. Если результат отрицательный - значит элемент слева меньше, если положительный - справа меньше, если равно, то, соответственно, оба элемента равны.
Есть между ними разница.
IComparable предоставляет один единственный метод CompareTo. Этот метод сравнивает ТЕКУЩИЙ объект с аргументом.
IComparer предоставляет метод Compare, который принимает как аргументы 2 объекта другого типа.
Реализация IComparable:
class User : IComparable { public int Age { get; set; } public string Name { get; set; } public string Surname { get; set; }public User() { } public User(int age, string name, string surname) { Age = age; Name = name; Surname = surname; } public int CompareTo(User user) { return Age - user.Age; } }</pre>
Реализация IComparer:
class User : IComparer { public int Age { get; set; } public string Name { get; set; } public string Surname { get; set; }public User() { } public User(int age, string name, string surname) { Age = age; Name = name; Surname = surname; } public int Compare(User user1, User user2) { return user1.Age - user2.Age; } }</pre>