4

我想使用一个类作为字典中的键,它不会覆盖 Equals 或 GetHashCode。这是我不想修改的外部库中的一个类。

所以我想知道我是否可以只为一个字典使用自定义的“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>. 相等比较器必须实现Equaland 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 回答