-1

我正在尝试从 Hashtable 存储和获取一些值。当我通过将键传递给该哈希表来获取值时,它返回一个空值。但这具有将该传递的值作为键的表。

我正在使用一些字符串变量添加 Hashtable 键和值。

编辑: 这是我的代码。

Hashtable hashtbl = new Hashtable();
string[,] ValueArray =new string[3,2];
 ValueArray[0,0]="key1";
 ValueArray[0,1]="value1";
 ValueArray[1,0]="key2";
 ValueArray[1,1]="value2";
 ValueArray[2,0]="key3";
 ValueArray[2,1]="value3";

 for(int i=0;i<ValueArray.GetUpperBound(0);i++)
 {
     string mykey=ValueArray[i,0];
     string myval=ValueArray[i,1];
 if (hashtbl.ContainsKey(mykey)==false)
     {
   hashtbl.Add(mykey,myval);
     }
   }

之后我试图获得像

string newVal =hashtbl[mykey].ToString();

它抛出一个空异常。

4

2 回答 2

2

有几种可能:

  • 你已经nullmykey之前插入了,现在你把它拿回来了,因为if语句返回true
  • myval为 null 并且您的代码可以完美运行
  • mykey是有一个非常奇怪的实现的类型GetHashCode

前两个选项实际上是不可能的,就像hashtbl[mykey].ToString()throw一样NullObjectReference。我还假设这不是真正的代码,因为我想不出x.ToString()会返回 null 的场景,除非您忘记提及它myval 是您的自定义类型,它以一种奇怪的方式覆盖它。

因此,我会假设后者:是您的类型以它返回的方式myval覆盖。ToStringnull

编辑:在显示您的代码并澄清最后一行不返回 null 而是抛出之后,看起来第二种情况正在发生。如果您通过调试器运行代码,您将看到您正在为键索引大于 2 的每个条目插入空值。因此,哈希表返回空值。

这个片段是可疑的:ValueArray.GetUpperBound(0) - 1. 尝试删除“-1”。

于 2012-10-05T12:51:14.337 回答
0

我已经执行了以下代码,它在我这边运行良好。请检查您是否myKeyhasttbl. myKey 应该是您在 hashtbl 中输入的 sctual 字符串键。

class Program
    {
        static void Main(string[] args)
        {
            Hashtable hashtbl = new Hashtable();
            string[,] ValueArray = new string[10, 2];
            ValueArray[0, 0] = "key1";
            ValueArray[0, 1] = "value1";
            ValueArray[1, 0] = "key2";
            ValueArray[1, 1] = "value2";
            ValueArray[2, 0] = "key3";
            ValueArray[2, 1] = "value3";

            for (int i = 0; i < ValueArray.GetUpperBound(0) - 1;i++)
            {
                if (ValueArray[i, 0] == null)
                    continue;

                string mykey = ValueArray[i, 0];
                string myval = ValueArray[i, 1];
                if (hashtbl.ContainsKey(mykey) == false)
                {
                    hashtbl.Add(mykey, myval);
                }
            }

            foreach (string key in hashtbl.Keys)
            {
                string newVal = hashtbl[key].ToString();

                Console.WriteLine("New value: " + newVal);
            }
            Console.ReadLine();
        }
    }

输出

New value: value2 
New value: value3 
New value: value1
于 2012-10-05T13:18:10.877 回答