【问题标题】:'Contains' method returns false“包含”方法返回 false
【发布时间】:2011-06-09 23:47:33
【问题描述】:

我遇到了一些奇怪的问题。

我有一个 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 时就停止了,我想知道这个 contains 方法是如何工作的.....

【问题讨论】:

  • 你是否也重写了GetHashCode() 方法?
  • 也发布您的GetHashCode 覆盖代码 - 如果有错误,Equals 将不会运行。

标签: c# asp.net equals contains entitycollection


【解决方案1】:

如果你使用:你的问题会消失吗:

    public override int GetHashCode()
    {
        return 0;
    }

请注意,这只是一个调试测试,不是真实的建议


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

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

请注意,GetHashCode() 只是一个性能增强,如果您对性能感到满意,那么您就完成了。如果不是,另一个简单的哈希码是排除 Equal 方法中使用的所有比较。比如:

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

记住 GetHashCode() 是一种性能增强,不要花太多时间计算它。也许在上述情况下,以下可能是性能更好的哈希码:

return LastName.GetHashCode();

【讨论】:

  • 配合它现在可以工作了,非常感谢!你能解释一下吗?
  • 非常感谢!返回对象的 id 呢?
【解决方案2】:

让你的实体类实现IEquatable&lt;T&gt;

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2021-09-23
    • 2016-11-20
    • 2012-11-01
    相关资源
    最近更新 更多