Я пытаюсь понять, какой из этих интерфейсов мне нужно реализовать. По сути, они оба делают одно и то же. Когда я буду использовать одно вместо другого?
.net
icomparable
icomparer
Мика
источник
источник
Ответы:
Ну, это не совсем то же самое, что
IComparer<T>
реализовано в типе, способном сравнивать два разных объекта, в то времяIComparable<T>
как реализовано в типах, которые могут сравнивать себя с другими экземплярами того же типа.Я обычно использую,
IComparable<T>
когда мне нужно знать, как другой экземпляр относится кthis
экземпляру.IComparer<T>
полезен для сортировки коллекций, посколькуIComparer<T>
стоит вне сравнения.источник
IComparable
что я сравним . а значит, меня можно сравнить с чем-то другим. И читая,IComparer
как я сравниваю, я просто сравниваю, что означает, что я сравниваю некоторые вещи.Используйте,
IComparable<T>
когда у класса есть внутреннее сравнение.Используйте,
IComparer<T>
если вам нужен метод сравнения, отличный от внутреннего сравнения класса, если он есть.источник
Это зависит от сущности. Например, следуя примеру класса «Студент», имеет смысл иметь IComparable на основе имени.
Но если учитель «А» хочет сравнить учеников на основе MathScore, а учитель «Б» хочет сравнить учеников на основе EnglishScore. Было бы неплохо реализовать IComparer отдельно. (Больше похоже на шаблон стратегии)
источник
Все зависит от того, является ли ваш тип изменчивым или нет. Вы должны реализовывать IComparable только для неизменяемых типов. Обратите внимание, что если вы реализуете IComparable, вы должны переопределить Equals вместе с операторами ==,! =, <И> (см. Предупреждение анализа кода CA1036).
Цитата Дэйва Джи из этого сообщения в блоге :
источник
Простое объяснение через рассказ
Баскетбол средней школы. Это выбор школьного двора для команд. Я хочу собрать в команду самых высоких / лучших / самых быстрых людей. Что мне делать?
Интерфейс IComparer - Сравните двух людей разных людей
Compare(Fred, John)
и выплевывает, кто лучше.А как насчет IComparable? - Сравните себя с кем-то другим
Вы недавно были на FB? Вы видите, как другие люди занимаются крутыми вещами: путешествуют по миру, создают изобретения, а я делаю что-то не такое уж крутое - ну, мы используем интерфейс IComparable.
А как насчет класса Comparer?
Класс Comparer - это абстрактный базовый класс, реализующий интерфейс IComparer. Чтобы иметь конкретную реализацию, вы должны быть производным от этого класса. в любом случае Microsoft рекомендует ДЕЙСТВИТЕЛЬНО использовать класс Comparer, а не реализовывать интерфейс IComparer:
Резюме
Надеюсь, рассказы помогут вам вспомнить.
источник
Как говорили другие, они не делают то же самое.
В любом случае сейчас я не использую IComparer. Зачем мне? Его ответственность (внешняя сущность, используемая для сравнения двух объектов) может быть решена гораздо более четко с помощью лямбда-выражения, аналогично тому, как работает большинство методов LINQ. Напишите короткую лямбду, которая принимает объекты для сравнения в качестве аргументов и возвращает логическое значение. И если объект определяет свою собственную внутреннюю операцию сравнения, вместо этого он может реализовать IComparable.
источник
IComparable говорит, что объект можно сравнивать с другим. IComparer - это объект, который может сравнивать любые два элемента.
источник
IComparer - это интерфейс, который используется для сортировки массива, этот интерфейс заставит класс реализовать метод Compare (T x, T y), который будет сравнивать два объекта. Экземпляр класса, который реализовал этот интерфейс, используется при сортировке массива.
IComparable - это интерфейс, реализованный в типе, который должен сравнивать два объекта одного типа. Этот сопоставимый интерфейс заставит класс реализовать следующий метод CompareTo (T obj)
IEqualityComparer - это интерфейс, который используется для поиска объекта, независимо от того, равен он или нет. Теперь мы увидим это в примере, где нам нужно найти Отличительные черты объекта в коллекции. Этот интерфейс реализует метод Equals (T obj1, T obj2)
Теперь мы возьмем пример, у нас есть класс Employee, на основе этого класса мы должны создать коллекцию. Теперь у нас есть следующие требования.
Отсортируйте массив с помощью класса Array 2. Нужна коллекция с помощью Linq: удалить дубликат, упорядочить по возрастанию к меньшему, удалить один идентификатор сотрудника
открытый класс EmployeeIdSorter: IComparer {public int Compare (Employee x, Employee y) {if (x.Id <y.Id) return 1; иначе, если (x.Id> y.Id) return -1; иначе вернуть 0; }}
Для получения дополнительной информации см. Ниже http://dotnetvisio.blogspot.in/2015/12/usage-of-icomparer-icomparable-and.html
источник