Должны ли мы расширять Comparer <t> или реализовать IComparer <t>

Какова наилучшая практика в С#, начиная с версии 4.0 при написании класса сравнения:

а. Должны ли мы наследовать от абстрактного класса Comparer? или

б. Должны ли мы реализовать интерфейс IComparer.

Каковы плюсы и минусы?

Ответ 1

Я бы рекомендовал расширить класс Comparer<T> вместо реализации интерфейса IComparer<T>, как и Microsoft (см. Первую ссылку ниже).

Теперь, если вы хотите, чтобы ваш объект (независимо от того, что T) мог сравнивать с самим собой, он может реализовать интерфейс IComparable (см. Вторую ссылку ниже).


От: http://msdn.microsoft.com/en-us/library/8ehhxeaf(v=vs.110).aspx (IComparer<T>)

Мы рекомендуем, чтобы вы вышли из класса Comparer<T> вместо реализации интерфейса IComparer, потому что класс Comparer<T> предоставляет явную реализацию интерфейса метода IComparer.Compare и свойство Default которое получает IComparer.Compare по умолчанию для объекта.

От: http://msdn.microsoft.com/en-us/library/cfttsh47(v=vs.110).aspx (Comparer<T>)

Выведите этот класс, чтобы обеспечить пользовательскую реализацию интерфейса IComparer<T> для использования с классами коллекций, такими как классы SortedList<TKey, TValue> и SortedDictionary<TKey, TValue>. Разница между выводом класса Comparer и внедрением интерфейса System.IComparable выглядит следующим образом:

  • Чтобы указать, как по умолчанию сопоставлять два объекта, реализуйте интерфейс System.IComparable в своем классе. Это гарантирует, что операции сортировки будут использовать код сравнения по умолчанию, который вы предоставили.
  • Чтобы определить сравнитель для использования вместо сравнения по умолчанию, выведите его из класса Comparer. Затем вы можете использовать этот компаратор в операциях сортировки, которые принимают сравнительный параметр в качестве параметра.

Ответ 2

Из этой статьи в MSDN:

Мы рекомендуем, чтобы вы вышли из класса Comparer вместо реализации интерфейса IComparer, поскольку класс Comparer предоставляет явную реализацию интерфейса метода IComparer.Compare и свойство Default, которое получает сопоставитель по умолчанию для объекта.