Метод «Содержит» возвращает false - PullRequest
1 голос
/ 16 января 2011

У меня странная проблема.

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

Я переопределил метод Equals T, но метод Contains не вызывает его (хотя об этом сказано в документации).

Когда я делаю 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 });
    }

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

Ответы [ 2 ]

3 голосов
/ 16 января 2011

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

    public override int GetHashCode()
    {
        return 0;
    }

Обратите внимание, что это всего лишь тест отладки, а не реальное предложение


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

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

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

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

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

return LastName.GetHashCode();
1 голос
/ 16 января 2011

Пусть ваш класс сущностей реализует IEquatable<T>.

...