我需要一种为对象字典生成键的方法。但是,我有一些要求使这变得有些困难。这是场景:
private
在静态类中为。equal
字典中的另一个对象,则关键字必须是不同的,因为它们是两个单独的对象。解决方案#1
所有.Net对象都包含一个称为的方法.GetHashCode()
,该方法返回一个整数值。您可以将其用作键。
问题
不可能。MSDN状态:
相等的两个对象返回相等的哈希码。
这打破了要求5,我假设(但未经测试)要求。#4。如果它可以满足这些规则,我希望有这样的选择。
解决方案2
将对象的指针转换为,int
然后将其用作键。
问题
这打破了要求的本质。#3。传递指针并将其用作键并不安全。
解决方案3
将对象的指针转换为该值的整数哈希值,并将哈希值用作键。
问题
尽管这不会违反任何规则,但我还是希望避免访问指针,因为这将涉及使用unsafe
代码。我不反对使用不安全的代码,但如果可能的话,我宁愿避免使用它。
也许我的要求有些挑剔。必须有某种合理的方法来从唯一对象派生密钥。有没有人经历过这样的情况并解决了这个难题?
1词典是ByRef对象的列表。
对象始终是.NET中的“通过引用”。这可能是误会的开始。参考相等是您需要/想要的。
3外部代码需要获取字典中特定对象的密钥,但绝对不能访问字典中的对象或字典本身。
这是真正的问题。没有它,对对象本身的引用将起作用。但是该框架仍然可以立即提供您的所有功能:
private Dictionary<object, MyClass> _myStore;
// add an item and return a key
public object Add(MyClass item)
{
object key = new object();
_myStore.Add(key, item);
return key;
}
并满足要求4:
private Dictionary<object, MyClass> _itemForKey; // was _myStore
private Dictionary<MyClass, object> _keyForItem;
// add an item and return a key
public object Add(MyClass item)
{
object key = new object();
_itemForKey.Add(key, item);
_keyForItem.Add(item, key);
return key;
}
protected object DeriveKeyFromItem(MyClass item)
{
return _keyForItem[item];
}
注意:这些示例不是线程安全的(要求6),但这是要解决的标准功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句