使用键的克隆从哈希表中检索值;C#

3
我想知道是否有可能使用与实际键相同但是不同对象的键从哈希表中检索项目。我理解这可能不可能,但我想看看是否有任何巧妙的方法可以做到这一点。
我的问题源于我太愚蠢了,创建了以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;


        }

似乎你的设计有些问题... - Hamish Grubijan
@Hamish Grubijan,你为什么这么说?当使用一个新创建但其他方面相等的键实例时,在Hashtable中查找值有什么问题吗?这是一个常见的情况,在.NET中得到了很好的支持。 - Samuel Neff
1
@Sam,设计问题在于使用了不提供值相等语义的键。Hashtable的理想键应该是1)不可变的2)重写equals 3)重写gethashcode。数组没有满足这些标准中的任何一个。 - Josh
1
我认为第一点是迄今为止最重要的。可变哈希键会导致重复哈希键的可能性。如果需要的话,其他问题可以在其他地方解决。 - Adam Robinson
1个回答

8
是的,您有两个选择。
  1. 在键类中实现Equals()GetHashCode()
  2. 创建自定义的IEqualityComparer并将其传递给Hashtable构造函数。
当自定义类的所有用法都适合使用时,应该自己实现Equals()GetHashCode()。如果它们只在某些情况下合适,则使用自定义的IEqualityComparer,它具有相同的功能但与类本身分开提供。这第二个选项还允许您为非自定义键类提供自定义规则。

选择第二个选项加一分(因为他无法从“int []”继承) - Adam Robinson
再次支持选项2。虽然我强烈建议更改应用程序的设计,以使用更合适的密钥。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接