-1

Hashtable からいくつかの値を保存して取得しようとしています。そのハッシュテーブルにキーを渡して値を取得すると、null が返されます。しかし、それには、渡された値をキーとして持つテーブルがあります。

いくつかの文字列変数を使用して 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();

null 例外をスローします。

4

2 に答える 2

2

いくつかの可能性があります:

  • nullあなたはすでに beforeの下に挿入されており、ステートメントが返さmykeyれたので、今はそれを取り戻していますiftrue
  • myvalnull であり、コードは問題なく動作します
  • mykeyの非常に奇妙な実装を持つタイプですGetHashCode

hashtbl[mykey].ToString()最初の 2 つのオプションは、 throwのように実際には使用できませんNullObjectReference。 また、奇妙な方法でオーバーライドするカスタムタイプであるx.ToString()ことを忘れない限り、null を返すシナリオが考えられないため、これは実際のコードではないと想定します。myval

したがって、後者を想定します:を返す方法myvalでオーバーライドするタイプです。ToStringnull

編集:コードを表示し、最後の行が null を返さずにスローすることを明確にした後、2 番目のシナリオが発生しているように見えます。デバッガーでコードを実行すると、キー インデックスが > 2 である各エントリに null 値を挿入していることがわかります。したがって、hashtable は null を返します。

このスニペットは疑わしい: ValueArray.GetUpperBound(0) - 1. 「-1」を削除してみてください。

于 2012-10-05T12:51:14.337 に答える
0

私は次のコードを実行しました、そしてそれは私の側でうまく働きます。myKeyでインデックスとして指定しているかどうかを確認してくださいhasttbl。myKeyは、hashtblに入力した文字列キーである必要があります。

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 に答える