4

整数、文字列、ブール値のデータ型の配列を値として持つ辞書を作成しようとしています。私は、object []を値として使用する必要があると考えたので、宣言は次のようになります。

Dictionary<long, object[]> netObjectArray = new Dictionary<long, object[]>();

その要素の値を何かに設定しようとすると、VSは辞書にそのようなキーが見つからなかったと言います。

netObjectArray[key][2] = val; // ex: The given key was not present in the dictionary.

これを正しく処理するにはどうすればよいですか?

UPD1: どういうわけか、この例外をスローする直前に、他の辞書が同様の方法で問題なく使用されます。

Dictionary<long, Vector2> netPositions = new Dictionary<long, Vector2>();
netPositions[key] = new Vector2(x, y); // works ok

このローカルが表示された後、値が割り当てられ、辞書にそのエントリが含まれるようになります。他の辞書ではそうではないのはなぜですか?

解決策:値の配列に値を書き込む前に、まずその配列を初期化する必要があります。このコードは私のために働きます:

try { netObjectArray[key] = netObjectArray[key]; } // if the object is undefined,
catch { netObjectArray[key] = new object[123]; } // this part will create an object
netObjectArray[key][0] = new Vector2(x, y) as object; // and now we can assign a value to it :)
4

3 に答える 3

6

これは当然のことです。キーが に存在しない場合、そのキーDictionary<K,V>を読み取ろうとすると失敗します。keyアクセスする前に、要素に空の配列を割り当てる必要があります。

キーが存在するかどうかわからない場合に辞書にアクセスする典型的なパターンを次に示します。

object[] data;
if (!netObjectArray.TryGetValue(key, out data)) {
    data = new object[MyObjCount];
    netObjectArray.Add(key, data);
}
data[2] = val;

EDIT(質問の編集に応じて)

以前は不明なキーでディクショナリを読み取ろうとした場合にのみ、例外が表示されます。あなたのような課題

netPositions[key] = new Vector2(x, y);

割り当て時にキーがディクショナリにない場合でも許可されます。これにより、ディクショナリで「挿入または更新」操作が実行されます。

于 2012-04-10T20:22:28.500 に答える
1

次のようなことを試してください:

Dictionary<long, object[]> netObjectArray = new Dictionary<long, object[]>();
for (int i = 0; i < 100; i++) netObjectArray[i] = new object[100];//This is what you're missing.
netObjectArray[key][2] = val;
于 2012-04-10T20:25:13.660 に答える
0
Dictionary<string, object[]> complex = new Dictionary<string, object[]>();

complex.Add("1", new object[] { 1, 2 });

object[] value = complex["1"];
value[1] = val;

私のために働く...

于 2012-04-10T20:26:42.343 に答える