c# - 使用 "external"GetHashCode 和等于字典

标签 c# dictionary

我想在不覆盖 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 可用于定义自定义比较。

我不想从类派生,因为对象是使用现有类在外部创建的。

我可以创建一个包含原始类的类,但这会改变对字典的访问。

感谢您的想法!

最佳答案

当然 - 您可以实现 IEqualityComparer<T> 并将其传递给 the Dictionary<,> constructor .这正是该构造函数的目的:)

例如:

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());

关于c# - 使用 "external"GetHashCode 和等于字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14403187/

相关文章:

c# - 通知 SignalR 客户端 IIS 重启/关闭

c# - 如何使用 Dictionary/List<Document> 过滤这些数据?

python - 如何将嵌套的 python 字典转换为简单的命名空间?

javascript - 有条件地递归更改所有节点和边的不透明度(d3)

c# - 将斜杠添加到自关闭标签

c# - 在不将整个表加载到内存的情况下检查哪些消息已经存在

c# - 如何使用 SetConsoleHandler() 来阻止退出调用

c# - Form.ShowDialog() 或 Form.ShowDialog(this)?

java - 从使用 Java 流的员工列表中获取特定加入日期之前和之后的员工

java - 具有一组自身的 Hibernate 映射实体