我正在尝试使用整数,字符串和布尔数据类型的数组作为值创建一个Dictionary。我想,我应该使用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 :)
答案 0 :(得分:6)
这是预期的:如果Dictionary<K,V>
中没有密钥,则尝试读取该密钥失败。在访问元素之前,您应该为key
的元素分配一个空数组。
当您不知道密钥是否存在时,这是访问字典的典型模式:
object[] data;
if (!netObjectArray.TryGetValue(key, out data)) {
data = new object[MyObjCount];
netObjectArray.Add(key, data);
}
data[2] = val;
编辑(响应问题编辑)
只有在尝试使用以前未知的密钥读取字典时,才会看到异常。像你这样的作业
netPositions[key] = new Vector2(x, y);
允许使用,即使在分配时密钥不在字典中:这会对您的字典执行“插入或更新”操作。
答案 1 :(得分: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;
答案 2 :(得分:0)
Dictionary<string, object[]> complex = new Dictionary<string, object[]>();
complex.Add("1", new object[] { 1, 2 });
object[] value = complex["1"];
value[1] = val;
适合我...