1

奇妙な問題があります。

要素を含むものがあります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 を使い始めたときに停止しました。

4

2 に答える 2

3

以下を使用すると、問題は解決しますか?

    public override int GetHashCode()
    {
        return 0;
    }

これは単なるデバッグテストであり、実際の提案ではないことに注意してください


これが問題であることがわかったので、説明しましょう。

オブジェクトには、強い ID (Equals) と弱い ID (GetHashCode) があります。GetHashCode ID はビン番号と考えることができます。これらの ID は、ハッシュ テーブルに挿入された後に変更してはなりません。変更しないと、ハッシュ テーブルの操作が正しく機能しなくなります。GetHashCode() が 0 を返すようにすることで、「誰もが同じビンにいる」という最も弱い同一性を与えましたが、それは変わりませんでした。

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

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

GetHashCode() はパフォーマンスの向上であることを忘れないでください。計算に時間をかけすぎないようにしてください。おそらく上記の場合、次のハッシュコードの方がパフォーマンスが優れている可能性があります。

return LastName.GetHashCode();
于 2011-01-16T15:26:40.760 に答える
1

エンティティ クラスに を実装させIEquatable<T>ます。

于 2011-01-16T14:04:13.430 に答える