簡體   English   中英

'Contains'方法返回false

[英]'Contains' method returns false

我有一些奇怪的問題。

我有一個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時停止,我想知道這包含方法如何工作.....

如果您使用以下問題,您的問題會消失:

    public override int GetHashCode()
    {
        return 0;
    }

請注意,這只是一個調試測試,而不是真實的建議


現在我們知道這是問題,讓我解釋一下。

您的對象具有強身份(Equals)和弱身份(GetHashCode)。 GetHashCode標識可以視為bin編號。 這些idenitites在插入哈希表后不得更改,否則哈希表操作將無法正常工作。 通過讓GetHashCode()返回0,我給了它最弱的所有idenitites,“每個人都在同一個bin中”,但它並沒有改變。

請注意,GetHashCode()只是一種性能增強,如果您對性能感到滿意,那么您就完成了。 如果沒有,另一個簡單的哈希碼將用於表示Equal方法中使用的所有比較。 就像是:

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

記住GetHashCode()是一種性能增強,不要花太多時間來計算它。 也許在上面的例子中,以下可能是一個更好的perfoming哈希碼:

return LastName.GetHashCode();

讓你的實體類實現IEquatable<T>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM