2014-09-15 8 views
1

Допустим, я создаю экземпляр словаря, как этотКакой IEqualityComparer используется в словаре?

var dictionary = new Dictionary<MyClass, SomeValue>(); 

И MyClass мой собственный класс, реализующий IEqualityComparer<>.

Теперь, когда я делаю операции над словарем - например, Add, Contains, TryGetValue и т. Д. - использует ли словарь по умолчанию EqualityComparer<T>.Default, так как я никогда не передавал его в конструктор или не использовал IEqualityComparer, который реализует MyClass?

Thanks

+0

'EqualityComparer .Default' используется. http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs – Vache

ответ

3

Он будет использовать сопоставитель равенства по умолчанию.

Если объект способен сравнивать себя для равенства с другими объектами, тогда он должен реализовать IEquatable, а не IEqualityComparer. Если тип реализует IEquatable, то это будет использоваться как реализация EqualityCOmparer.Default, а затем методы object.Equals и object.GetHashCode.

A IEqualityComparer предназначено для сравнения другое объекты для равенства, а не сами.

0

Он будет использовать IEqualityComparer<T>.Default, если вы не укажете явно никакого сопоставления равенства.

Этот сопоставитель равенства по умолчанию будет использовать методы Equals и GetHashCode вашего класса.

Ваш класс ключей не должен реализовывать IEqualityComparer, этот интерфейс должен быть реализован, если вы хотите делегировать сравнения сравнений с другим классом. Когда вы хотите, чтобы сам класс обрабатывал сравнения сравнений, просто переопределите Equals и GetHashCode (вы также можете реализовать IEquatable<T>, но это не требуется строго).

+0

Если сопоставитель равенства по умолчанию использует методы 'Equals' и' GetHashCode' методов моего класса, которые были переопределены, когда я реализовал IEqualityComparer <> - не означает ли это, по сути, не использование сравнения по умолчанию, а скорее мое? –

+0

Нет. Методы на 'IEqualityComparer ' имеют одинаковые имена, но не одни и те же сигнатуры, поэтому это не те же методы. –

Смежные вопросы