Зачем нам нужен интерфейс IEqualityComparer, IEqualityComparer <T>? - PullRequest
6 голосов
/ 13 октября 2011

в объектном классе существуют методы Equal и GetHashcode, а наш тип наследует базовый класс объекта.В чем разница между реализацией двух методов объекта напрямую и использованием интерфейса IComparer?

если мы переопределим объект Equal и GetHashCode и передадим его в хеш-таблицу, он будет использовать метод равного переопределения?

в чем отличие новой хеш-таблицы с конструктором IEqualityComparer?

Ответы [ 2 ]

14 голосов
/ 13 октября 2011

Интерфейс IComparable используется, когда вам нужно иметь возможность "сортировать" объекты, и он дает вам метод (CompareTo), который сообщает вам, являются ли два объекта <, = или>. Конструктор, использующий IEqualityComparer, позволяет вам указать конкретный Equals / GetHashCode, который может отличаться от того, который определен вашим объектом. Обычно Hashtable будет использовать ваш объект переопределенный Equals и GetHashCode (или базовые object Equals и GetHashCode).

Например, стандартная строка сравнивается с учетом регистра ("A"! = "a"), но вы можете создать вспомогательный класс IEqualityComparer, чтобы иметь возможность хешировать ваши строки без учета регистра. (технически этот класс уже присутствует в нескольких вариантах: они называются StringComparer.InvariantCultureIgnoreCase и все другие статические методы StringComparer, которые возвращают StringComparer объект, который реализует IComparer, IEqualityComparer, IComparer<string>, IEqualityComparer<string>)

Как примечание, Hashtable использует необязательный параметр IEqualityComparer, а не универсальную версию IEqualityComparer<T>, поскольку Hashtable является предварительным.

1 голос
/ 13 октября 2011

интерфейсы IComparer (как общий, так и не универсальный) позволяют сравнивать два экземпляра друг с другом.

Метод Compare позволяет сравнивать сам объект с другим экземпляром.Конечно, когда текущий экземпляр имеет значение null, в этом случае вы получите NullReferenceException, так как вы вызываете Compare для экземпляра 'null'.Класс, реализующий IComparer, может решить эту проблему.

Итак, когда вы реализуете интерфейс IComparer, у вас будет класс, у которого есть метод Compare, который можно вызывать так:

public class MyObjectComparer : IComparer<MyObject>
{
    public int Compare( MyObject first, MyObject second )
    {
       // implement logic here to determine whether first is less, greater or equal then second.
    }
}

Это позволяет вам сделать это:

var c = new MyObjectComparer();
var one = new MyObject();
var two = new MyObject();
c.Compare (one, two);

Когда вы создаете экземпляр Hashtable с помощью конструктора, в котором вы указываете экземпляр IEqualityComparer, это означает, что данный IEqualityComparerбудет использоваться для определения наличия определенного ключа в Hashtable.
В противном случае будет использован метод Compare объекта ключа.

...