[英]'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.