4

EqualsやGetHashCodeをオーバーライドしないディクショナリのキーとしてクラスを使用したいと思います。これは、変更したくない外部ライブラリのクラスです。

それで、1つの辞書だけにカスタムの「GetHashCode」/「Equals」実装を使用できるかどうか疑問に思っていますか?C ++ std::mapsのようなものが可能かどうか疑問に思いました

template < class Key,                      // map::key_type
           class T,                        // map::mapped_type
           class Compare = less<T>,        // map::key_compare
           class Alloc = allocator<T> >    // map::allocator_type
           > class map;

ここで、Compareを使用してカスタム比較を定義できます。

オブジェクトは既存のクラスを使用して外部で作成されるため、クラスから派生させたくありません。

元のクラスを含むクラスを作成することもできますが、それによって辞書へのアクセスが変更されます。

あなたのアイデアをありがとう!

4

3 に答える 3

5

確かに - それを実装しコンストラクタIEqualityComparer<T>に渡すことができます。それがまさにそのコンストラクターの目的です:)Dictionary<,>

例えば:

public FooByNameEqualityComparer : IEqualityComparer<Foo>
{
    public int GetHashCode(Foo foo)
    {
        return foo.Name.GetHashCode();
    }

    public bool Equals(Foo x, Foo y)
    {
        return x.Name == y.Name;
    }
}

...

Dictionary<Foo, int> map = new Dictionary<Foo, int>(new FooByNameComparer());
于 2013-01-18T16:29:48.660 に答える
2

IEqualityComparer<TKey>のコンストラクターにカスタムを渡すことができますDictionary<TKey,TValue>。等値比較子は and を実装する必要がEqualありGetHashCodeます。

var dict = new Dictionary<MyKey,MyValue>(new MyKeyEqualityComparer());
于 2013-01-18T16:30:47.113 に答える
1

Dictionary Constructor (Int32, IEqualityComparer ) 、

public Dictionary(
    int capacity,
    IEqualityComparer<TKey> comparer
)

どこ

comparerは:

キーを比較するときに使用する実装

実際には

  • そのインターフェースを実装するタイプを定義します
  • この ctor に渡すと、そのクラスのメソッドが辞書のキーの等価性識別に使用されます。

あなたが望むもののようです。

于 2013-01-18T16:30:32.897 に答える