2011-01-16 12 views
1

私はいくつかの奇妙な問題があります。'Contains'メソッドは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} 

私は、WCFを使用し始めたとき、私が実際に使用したいコードが

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 }); 
    } 

これはかつて働いていたが、停止され、私はこのメソッドの動作が含まか疑問.. ...

+3

'GetHashCode()'メソッドもオーバーライドしましたか? – adrianbanks

+0

はい、持っています – kra

+0

あなたの 'GetHashCode'オーバーライドコードも投稿してください - バグがある場合、' Equals'は実行されません。 –

答えて

3

あなたが使用している場合、あなたの問題が離れて行くん:

public override int GetHashCode() 
    { 
     return 0; 
    } 

注意これは単なるデバッグテストではなく、本当の


のための提案である今、私たちは、これが問題である知っていることを、聞かせて私は説明する。

あなたのオブジェクトは強いアイデンティティ(等しい)と弱いアイデンティティ(GetHashCode)を持っています。 GetHashCodeのIDはビン番号と考えることができます。これらのidenititesは、ハッシュテーブルに挿入された後で変更してはいけません。さもなければ、ハッシュテーブルの操作は正しく機能しなくなります。 GetHashCode()が0を返すことによって、私はすべてのidenititesの中で最も弱いものを与えました、 "誰もが同じビンにあります"、しかしそれは変更されませんでした。

GetHashCode()は単なるパフォーマンスの向上であり、パフォーマンスに満足すれば完了です。そうでない場合、別の単純なハッシュコードは、Equalメソッドで使用されているすべての比較を除外することです。次のようなものがあります。

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

GetHashCodeおそらく上記のケースでは、次のコードはより良いパフォーマンスのハッシュコードであったかもしれません:

return LastName.GetHashCode(); 
+0

それは今働きます、ありがとう!これを説明できますか? – kra

+0

ありがとうございます!オブジェクトのIDを返すのはどうですか? – kra

1

エンティティクラスにIEquatable<T>を実装しましたか?

+0

私もこれを試しました、同じ効果 – kra

関連する問題