'Contains'方法返回false

时间:2011-01-16 13:42:14

标签: c# asp.net equals contains entitycollection

我有一些奇怪的问题。

我有一个EntityCollection< T >,其中包含一个元素,但Contains方法返回false。

我已经覆盖了T的'Equals'方法,但是'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 个答案:

答案 0 :(得分:3)

如果您使用以下内容,问题是否会消失:

    public override int GetHashCode()
    {
        return 0;
    }

请注意,这只是一个调试测试,而不是真正的

建议

现在我们知道这是问题,让我解释一下。

您的对象具有强大的身份(Equals)和弱身份(GetHashCode)。 GetHashCode标识可以视为bin编号。这些idenitites在插入哈希表后不得更改,否则哈希表操作将无法正常工作。通过让GetHashCode()返回0,我给了它最弱的所有idenitites,“每个人都在同一个bin中”,但它并没有改变。

请注意,GetHashCode()只是一种性能增强,如果您对性能感到满意,那么您就完成了。如果没有,另一个简单的哈希码将用于表示Equal方法中使用的所有比较。类似的东西:

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

记住GetHashCode()是一种性能增强,不要花太多时间来计算它。也许在上面的例子中,以下可能是一个更好的演示哈希码:

return LastName.GetHashCode();

答案 1 :(得分:1)

让您的实体类实现IEquatable<T>