[英]How do you use an object reference as a key in a C# dictionary when the class implements Equals and GetHashCode?
如果你有一个实现GetHashCode
和Equals
的类,你可以强制使用该类的字典作为基于对象引用进行比较的键,而不是使用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.