2011-01-16 5 views
1

У меня есть странная проблема.Метод «Содержит» возвращает false

У меня есть EntityCollection<T>, который содержит элемент, но метод Содержит возвращает false.

Я превысил метод «Равно» T, но метод «Содержит» не вызывает его (хотя это сказано в документации).

Когда я делаю foreach (T x in coll), x.Equals(element) возвращает true.

Спасибо за помощь.

код:

contains(object entCol, object val) 
    { 
     var coll = (ICollection<GraphicSockets>)entCol; 
     var socket = val as GraphicSockets; 
     foreach (GraphicSockets sock in coll) 
      socket.Equals(sock); //true for first element, GraphicSocket's Equals function called 
     coll.Contains(socket);//false, Equals function not called} 

код я бы на самом деле хотел бы использовать это

private static bool contains(object entCol, object val) 
    { 
     Type entColType = typeof(EntityCollection<>).MakeGenericType(val.GetType()); 
     MethodInfo contains = entColType.GetMethod("Contains"); 
     return (bool)contains.Invoke(entCol, new object[] { val }); 
    } 

это сработало один раз, но остановился, когда я начал использовать ФОС, я удивляюсь, как это содержит метод работает .. ...

+3

Вы также переопределили метод 'GetHashCode()'? – adrianbanks

+0

Да, у меня есть, thx – kra

+0

Вы также можете добавить код переопределения 'GetHashCode'.' Equals' не будет запущен, если у него есть ошибка. –

ответ

3

ли идти ваша проблема прочь, если вы используете:

public override int GetHashCode() 
    { 
     return 0; 
    } 

Примечание это просто тест отладки, а не предложение для реального


Теперь, когда мы знаем, что это проблема, пусть я объясню.

Ваш объект имеет сильную идентичность (равные) и слабую идентичность (GetHashCode). Идентификатор GetHashCode можно рассматривать как номер ячейки. Эти идентификаторы не должны меняться после того, как они вставлены в хеш-таблицу, иначе операции хеш-таблицы перестанут работать правильно. Получив GetHashCode() return 0, я дал ему самый слабый из всех idenitites, «все в одном ящике», но он не изменился.

Обратите внимание, что GetHashCode() - это просто повышение производительности, если вы довольны производительностью, все готово. Если нет, еще один простой хэш-код - исключить все сравнения, которые используются в методе Equal. Что-то вроде:

return LastName.GetHashCode()^FirstName.GetHashCode(); 

Помните GetHashCode() является enhancment производительности, не тратить слишком много времени вычисления его. Возможно, в приведенном выше случае, возможно, был лучший улучшающий хэш-код:

return LastName.GetHashCode(); 
+0

Mate сейчас работает, большое вам спасибо! Не могли бы вы объяснить это? – kra

+0

Большое спасибо! Как насчет возврата идентификатора объекта? – kra

1

Имейте класс сущности класса IEquatable<T>.

+0

Я тоже попробовал, тот же эффект – kra

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