繁体   English   中英

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

[英]How do you use an object reference as a key in a C# dictionary when the class implements Equals and GetHashCode?

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

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

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

你可以建立一个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>();
);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM