-1

カスタム オブジェクトをディクショナリ、リストなどで正しく機能させる必要があります。これにより、オブジェクトのプロパティを変更し、再ソートして孤立させないようにすることができます。

前回 GetHashCode() のオーバーライドを試みたとき、オブジェクトをディクショナリに追加したときにオブジェクトを孤立させ、オブジェクトに変更を加えた (GetHashCode が変更された) ため、ディクショナリがメモリからオブジェクトを適切に破棄できませんでした。

質問

誰かが説明できますか:

  • intソートされたディクショナリで連結してTrustedEntity正しく機能させるために、TrustedEntityReference でオーバーライドする必要があるインターフェイスとインターフェイスは何ですか?

  • .NET ディクショナリ オブジェクトで使用されているものに関して変更してはならない値、またはオブジェクトを孤立させるリスクがある値はどれですか? (たとえば、オブジェクトの発行されたハッシュコードを変更すると、辞書で GC の問題が発生する可能性があります)

これは、私が取り組んでいる現在のサンプル オブジェクトです。

namespace Model
{
    public class TrustedEntity
    {
        public TrustedEntity()
        {
            this.BackTrustLink = new List<TrustedEntityReference>();
            this.ForwardTrustLink = new List<TrustedEntityReference>();
        }

        public List<TrustedEntityReference> BackTrustLink { get; set; }

        public string EntryName { get; set; }

        public List<TrustedEntityReference> ForwardTrustLink { get; set; }
    }


    // This is the object I want to be treated as a "key" in the above List<T>
    // I want a duplicate object exception to occur if a duplicate TrustedEntityReference is inserted into trustedEntity.BackTrustLink or trustedEntity.ForwardTrustLink

    public class TrustedEntityReference   
    {
        public int HierarchyDepth { get; set; }
        public TrustedEntity TrustedEntity {get; set; }


    }
}
4

3 に答える 3

0

重複データが問題にならない限り、実際には特別なことをする必要はまったくありません (それが起こらないか、他の何かがそれを強制している、または複数回そこに入れたいため)。

具体的には、この回答に従って、任意のオブジェクトを使用でき、参照の等価性のみをチェックします。このオブジェクトは同じオブジェクトですか? 同じデータを持つ別のオブジェクトは異なりますが、データを変更した場合でも、同じオブジェクトは同じになります。

したがって、あなたの例でList<TrustedEntityReference>は、同じ初期データから を入力した場合、問題はありません。それぞれが独自のデータ セットをロードする場合、これは役に立ちません。

于 2012-10-16T17:41:16.960 に答える
0

リストまたはディクショナリを使用するためのインターフェイスは必要ありません

TKey は変更できません (変更しないと、間違ったキーを探すことになるため、辞書でエントリを見つけることができません)。

編集:
TKey タイプを見逃したようです。

ディクショナリには、キーが等しいかどうかを判断するための等価実装が必要です。比較パラメーターを受け入れるコンストラクターを使用して、IEqualityComparer ジェネリック インターフェイスの実装を指定できます。実装を指定しない場合、デフォルトの汎用等値比較子 EqualityComparer.Default が使用されます。TKey 型が System.IEquatable ジェネリック インターフェイスを実装している場合、既定の等値比較子はその実装を使用します。

これは、 TrustedEntityReference がIEqualityComparerインターフェイスを実装する必要があることを意味すると思います (ただし、同時にICompariableを実装します)。Dictionary(IEqualityComparer)コンストラクター
を使用して独自のものを指定することもできます。

オブジェクトの値が変更された場合でも、これらのインターフェイスのメソッドが常に同じ値を返すことが重要です。

http://msdn.microsoft.com/en-us/library/ms132072.aspx

さらに必要な場合はお知らせください。

于 2012-10-16T16:59:48.317 に答える
0

したがって、主なことは GetHashCode と Equals をオーバーライドすることです (並べ替えを除く)。次に確認する必要があるのは、GetHashCode から値を返したら、生成元の値が変更されたとしても、そのオブジェクトの存続期間中も同じ値を返す必要があるということです。

並べ替えには、デフォルトの比較子に IComparable が必要なだけでなく、独自の Comparer インスタンスを与えることもできます。

于 2012-10-16T17:00:27.777 に答える