字典与不同数据类型的数组作为值

use*_*322 4 c# arrays dictionary

我正在尝试使用整数,字符串和布尔数据类型的数组作为值创建一个Dictionary.我想,我应该使用object []作为值,所以声明看起来如此:

Dictionary<long, object[]> netObjectArray = new Dictionary<long, object[]>();
Run Code Online (Sandbox Code Playgroud)

每当我尝试将其元素的值设置为某个东西时,VS说字典中没有找到这样的键.

netObjectArray[key][2] = val; // ex: The given key was not present in the dictionary.
Run Code Online (Sandbox Code Playgroud)

我该如何正确使用它?

UPD1: 不知何故,在抛出此异常之前,另一个字典以类似的方式使用而没有问题:

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

在此本地显示之后,已分配值,字典现在包含该条目.为什么我的另一本字典不是这样的?

解决方案:在将值写入值数组之前,我们必须首先初始化该数组.这段代码适合我:

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 :)
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

这是预期的:如果密钥不存在,则Dictionary<K,V>尝试读取该密钥失败.您应该key在访问之前为元素分配一个空数组.

以下是当您不知道密钥是否存在时访问字典的典型模式:

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

编辑(响应问题的编辑)

只有在尝试使用以前未知的密钥读取字典时才会看到异常.像你这样的作业

netPositions[key] = new Vector2(x, y);
Run Code Online (Sandbox Code Playgroud)

允许,即使在分配时键不在字典中:这会对您的字典执行"插入或更新"操作.

  • @ user1306322你执行读取,但是以一种模糊的方式:`netObjectArray [key] [2] = val`相当于`(netObjectArray [key])[2] = val`,和`netObjectArray [key]`是试图在`key`读取一个对象数组.赋值操作的写入部分与您获取的对象数组相对. (2认同)