オブジェクトのIDを辞書のキーとして使用する方法 質問する

オブジェクトのIDを辞書のキーとして使用する方法 質問する

Dictonary<object, ...>オブジェクトが同一の場合にのみ辞書がそれらを等しいものとして扱うような方法で、オブジェクトを のキーとして使用することは可能ですか?

たとえば、次のコードでは、行 2 で 12 ではなく 11 を返すようにします。

Dictionary<object, int> dict = new Dictionary<object, int>();
object a = new Uri("http://www.google.com");
object b = new Uri("http://www.google.com");

dict[a] = 11;
dict[b] = 12;

Console.WriteLine(a == b);  // Line 1. Returns False, because a and b are different objects.
Console.WriteLine(dict[a]); // Line 2. Returns 12
Console.WriteLine(dict[b]); // Line 3. Returns 12

現在の辞書の実装ではキーにobject.Equals()とを使用していますobject.GetHashCode()が、オブジェクトの身元キーとして (オブジェクトの値ではなく)。.NET にはそのような辞書がありますか、それとも最初から実装する必要がありますか?

ベストアンサー1

独自の辞書を作成する必要はありません。IEqualityComparer<T>ハッシュと等価性の両方にアイデンティティを使用する独自の実装を構築する必要があります。考えるフレームワークにはそのようなものが存在しますが、RuntimeHelpers.GetHashCode

public sealed class IdentityEqualityComparer<T> : IEqualityComparer<T>
    where T : class
{
    public int GetHashCode(T value)
    {
        return RuntimeHelpers.GetHashCode(value);
    }

    public bool Equals(T left, T right)
    {
        return left == right; // Reference identity comparison
    }
}

T参照型に制限したので、オブジェクト辞書にこれを使うと、値型に奇妙な結果が出る可能性があります。(それがどのように機能するかはすぐにはわかりませんが、容疑者それは起こりません。

それが整ったら、残りは簡単です。例えば、次のようになります。

Dictionary<string, int> identityDictionary =
    new Dictionary<string, int>(new IdentityEqualityComparer<string>());

おすすめ記事