当类实现Equals和GetHashCode时,如何将对象引用用作C#字典中的键?

时间:2016-05-10 01:40:10

标签: c# wpf dictionary

如果你有一个实现GetHashCodeEquals的类,你可以强制使用该类的字典作为基于对象引用进行比较的关键字而不是生成哈希或使用Equals进行比较?

例如,如果我的资源中有一个全局的,不变的System.Drawing.Bitmap的集合,我可以通过它们根据C ++中的地址进行比较来便宜地将它们用作字典中的键吗?这些是相当大的图像,我讨厌让它生成哈希,甚至一次进行密钥查找。

我只是希望有一种更优化的方式来使用这些对象作为键,因为它们的引用和内容永远不会改变。

2 个答案:

答案 0 :(得分:3)

您可以使用自定义Dictionary构建IEqualityComparer,调用RuntimeHelpers.GetHashCode并使用object.ReferenceEquals进行相等性比较:

class IdentityEqualityComparer<T> : IEqualityComparer<T> where T : class {
    public bool Equals(T v1, T v2) {
        return object.ReferenceEquals(v1, v2);
    }
    public int GetHashCode(T v) {
        return RuntimeHelpers.GetHashCode(v);
    }
}

现在你可以制作一个这样的字典:

var identityDict = new Dictionary<MyKey,MyVal>(
    new IdentityEqualityComparer<MyKey>();
);

答案 1 :(得分:0)

您可能希望了解的是数据库。 Visual Studio具有创建SQL数据库的能力。从那里,您可以将一个值映射到另一个值。例如:您可以将一串随机生成的数字映射到图像的文件路径。我对System.Drawing不是很熟悉,所以我不知道你是否可以创建一个以编程方式生成图像的数据库。