我想知道是否有任何可能的方法使用与实际密钥相同的密钥从哈希表中检索项目,但是使用不同的对象。我理解为什么它可能不可能,但我想看看是否有任何棘手的方法来做到这一点。
我的问题源于这样一个事实,即像我一样愚蠢,我用int []作为键创建了哈希表,整数数组包含表示空间位置的索引。我不知何故知道我每次想要添加一个新条目时都需要创建一个新的int [],但忽略了当我生成空间坐标数组时,它们在从哈希表中检索值时将毫无价值。
现在我正在尝试重新排列事物,以便我可以将我的值存储在ArrayLists中,或者是否在每次我想要获取值时搜索Hashtable中的键列表。选项非常酷。
除非有办法让// 1像// 2一样工作!
提前致谢。
static void Main(string[] args)
{
Hashtable dog = new Hashtable();
//1
int[] man = new int[] { 5 };
dog.Add(man, "hello");
int[] cat = new int[] { 5 };
Console.WriteLine(dog.ContainsKey(cat)); //false
//2
int boy = 5;
dog.Add(boy, "wtf");
int kitten = 5;
Console.WriteLine(dog.ContainsKey(kitten)); //true;
}
答案 0 :(得分:8)
是的,您有两种选择。
在关键类中实施Equals()
和GetHashCode()
。
创建自定义IEqualityComparer
并将其传递给Hashtable
构造函数。
当实现对您的自定义类的所有用法有意义时,您将希望自己实现Equals()
和GetHashCode()
。如果它们有时仅适用,则使用具有相同功能的自定义IEqualityComparer
,但将其与类本身分开。第二个选项还允许您为非自定义键类提供自定义规则。