使用密钥克隆从哈希表中检索值;C#

使用密钥克隆从哈希表中检索值;C#,c#,hashtable,key,clone,C#,Hashtable,Key,Clone,我想知道是否有任何可能的方法可以使用与实际键相同但不同的对象的键从哈希表中检索项。我理解为什么这可能是不可能的,但我想看看是否有任何棘手的方法来做到这一点 我的问题源于这样一个事实:我和我一样愚蠢,创建了以int[]为键的哈希表,整数数组包含表示空间位置的索引。我知道每次我想添加一个新条目时都需要创建一个新的int[],但我忽略了这样一个想法:当我以后生成空间坐标数组时,它们在从哈希表检索值时毫无价值 现在,我正试图决定是否重新安排内容,以便在ArrayList中存储我的值,或者是否在哈希表中搜

我想知道是否有任何可能的方法可以使用与实际键相同但不同的对象的键从哈希表中检索项。我理解为什么这可能是不可能的,但我想看看是否有任何棘手的方法来做到这一点

我的问题源于这样一个事实:我和我一样愚蠢,创建了以int[]为键的哈希表,整数数组包含表示空间位置的索引。我知道每次我想添加一个新条目时都需要创建一个新的int[],但我忽略了这样一个想法:当我以后生成空间坐标数组时,它们在从哈希表检索值时毫无价值

现在,我正试图决定是否重新安排内容,以便在ArrayList中存储我的值,或者是否在哈希表中搜索我每次想要获取值时所需的键列表,这两个选项都不是很酷

当然,除非有办法让//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;


        }

是的,你有两个选择

  • 在键类中实现
    Equals()
    GetHashCode()

  • 创建一个自定义
    IEqualityComparer
    并将其传递给
    哈希表
    构造函数


  • 当实现对自定义类的所有用法都有意义时,您需要自己实现
    Equals()
    GetHashCode()
    。如果它们仅在某些时候适用,则使用自定义的
    IEqualityComparer
    ,它具有相同的功能,但与类本身分开提供。第二个选项还允许您为非自定义密钥类提供自定义规则。

    您的设计似乎有问题…@Hamish Grubijan,为什么这么说?使用新创建的但在其他方面相同的键实例时,在
    哈希表中查找值有什么错?这是一个常见的场景,在.NET中得到了很好的支持。@Sam,设计的问题在于使用了一个不提供值相等语义的键。哈希表的理想键是1)不可变2)重写equals和3)重写gethashcode。数组都不符合这些标准。我想说,到目前为止,第1点是最重要的。可变哈希键可能导致重复的哈希键。其他问题可以在别处解决,如果需要的话。选项2为+1(因为他不能很好地继承
    int[]
    )选项2为另一个+1。尽管我强烈建议更改应用程序的设计,以使用更合适的键。