2011-01-04 2 views
4

У меня есть класс с именем Class1 я переопределить его Равно функционировать Теперь у меня есть экземпляр словаря И я добавил экземпляр Class1 имени obj1 к нему. У меня есть еще один экземпляр класса 1 с именем OBJ2. код возвращает true для OBJ1.Equals (OBJ2). Но я не могу найти OBJ2 в словаре.словарь класса в C# - Равенство двух объектов

Вот псевдокод

Class1 OBJ1 = new Class1(x, y, z); 
Class1 OBJ2 = new Class1(a, b, c); 
Dictionary<Class1, int> dic1 = new Dictionary<Class1, int>(); 
dic1.Add(OBJ1, 3); 
OBJ1.Equals(OBJ2) -------------> return true 
Dictionary.ContainsKey(OBJ2) --------------> return false 

почему это происходит? Любая помощь будет приветствоваться

+4

Вы переопределили GetHashcode для своего класса? – BrokenGlass

ответ

3

сделать определенный Class1 переопределяет GetHashCode(). Возврат от этого метода проверяется первым при сравнении равенства. Реализация по умолчанию уникальна для каждого объекта.

+0

Большое спасибо за помощь. Он исправлен. – Masoud

12

Скорее всего, вы не переопределили GetHashCode в соответствии с Equals.

Договор GetHashCode требует, что если OBJ1.Equals(OBJ2) возвращает истину, то OBJ1.GetHashCode() должен возвращать такое же значение, как OBJ2.GetHashCode().

IIRC, вы получите ошибку компилятора (или хотя бы предупреждение), если вы переопределите Equals без переопределения GetHashCode().

Другая возможность заключается в том, что вы на самом деле не overriddenEquals, но перегружен его путем добавления новой подписи, например,

public bool Equals(Class1 other) 

В целом, чтобы обеспечить "естественное" значение сравнения равенства следует:

  • Override Equals (объект)
  • Override GetHashCode
  • Сильно рассмотреть вопрос об осуществлении IEquatable<T>
  • Рассмотрим перегрузки == и! =
13

2 возможности:

  1. GetHashCode не переопределены правильно. Вы можете взглянуть на Why is it important to override GetHashCode when Equals method is overriden in C#?
  2. OBJ1 был изменен после того, как он был добавлен в словарь таким образом, который влияет на его хэш-код. В этом случае ведро, в которое он помещен, больше не будет корректным - ContainsKey в конечном итоге будет охотиться за ним в другом ковше.

От Dictionary<TKey, TValue>:

До тех пор, как объект используется в качестве ключа в словаре, он не должен изменить каким-либо образом, что влияет на его хэш-значение.

3

Вы тоже переопределили GetHashCode? Можете ли вы продемонстрировать реализацию метода Equals?

4

Возможно, вы не переопределили GetHashcode в своем классе. Когда вы переопределяете Equals, вы также должны переопределять GetHashcode, иначе словарь не будет работать для вас.

3

Вы либо переопределили GetHashCode?

3

Вы должны переопределить GetHashCode как хорошо, но не забывайте, что вам, возможно, придется пройти в пользовательской Comparer в словарь конструктора, а as pointed out in this SO question

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