C# 字典 - 字典中不存在给定的键
C# Dictionary - The given key was not present in the dictionary
我目前正在尝试将游戏对象从 Tiled(Tiled 地图编辑器)地图文件加载到我用 C# 制作的游戏引擎中。我正在使用 TiledSharp(Link 到 github here)。它使用字典来保存有关我尝试加载的每个单独图块(或 'game object')的属性。但是由于某种原因,当我遍历属性时出现错误,如果我检查它是否为 null
也会出现错误
这是我正在使用的代码片段:
for (int l = 0; l < tmxMap.Tilesets[k].Tiles.Count; l++)
// This line throws an error
if (tmxMap.Tilesets[k].Tiles[l].Properties != null)
// and if I remove the above line, this line throws an error
for (int m = 0; m < tmxMap.Tilesets[k].Tiles[l].Properties.Count; m++)
我得到的错误是字典中不存在给定的键。但是...我什至没有检查密钥。
我是不是漏掉了什么?
如有任何帮助,我们将不胜感激。
The error I get says The given key was not present in the dictionary. But... I'm not even checking for a key.
是的,您正在检查密钥。这是您的代码:
if (tmxMap.Tilesets[k].Tiles[l].Properties != null)
您正在使用键 k
检查 Tilesets
,然后使用键 l
检查 Tiles
。如果 Tilesets
不包含键为 k
的项目,您将收到该错误。 Tiles
键 l
.
也是如此
您可以在使用词典时执行以下操作:
选项 1
查找执行了两次:一次查看该项目是否存在,然后第二次获取值:
var items = new Dictionary<string, string>();
items.Add("OneKey", "OneValue");
if(items.ContainsKey("OneKey"))
{
var val = items["OneKey"];
}
选项 2
这是另一种只执行一次查找的方法:
string tryVal;
if (items.TryGetValue("OneKey", out tryVal))
{
// item with key exists so you can use the tryVal
}
据我在您的代码中所见,我认为 Tiles 是一个字典,当您尝试按 tmxMap.Tilesets[k].Tiles[l]
进行迭代时,它会抛出错误,因为它搜索键 l,而不是 l 元素。
你可以试试tmxMap.Tilesets[k].Tiles[tmxMap.Tilesets[k].Tiles.Keys.ElementAt(l)]
您正在尝试获取基于键 k
、l
的值。
if (tmxMap.Tilesets[k].Tiles[l].Properties != null)
语句基本上是获取对应于 Tilesets
字典中的 k
键的值。如果 Tilesets
字典不包含键 k
的值,将抛出异常。另外,如果 l
键没有对应的值,在 Tiles 字典中,将抛出异常。
您可以使用 TryGetValue
扩展方法,如果找到该项目,它将为您提供值。
TileSet ts = null;
if(tmxMap.Tilesets.TryGetValue(k, out ts)
{
for (int l = 0; l < ts.Tiles.Count; l++)
{
Tiles tl = null;
if(ts.TryGetValue(l,out tl)
{
if (tl.Properties != null)
{
for (int m = 0; m < tl.Properties.Count; m++)
{
//Do something
}
}
}
}
}
我目前正在尝试将游戏对象从 Tiled(Tiled 地图编辑器)地图文件加载到我用 C# 制作的游戏引擎中。我正在使用 TiledSharp(Link 到 github here)。它使用字典来保存有关我尝试加载的每个单独图块(或 'game object')的属性。但是由于某种原因,当我遍历属性时出现错误,如果我检查它是否为 null
也会出现错误这是我正在使用的代码片段:
for (int l = 0; l < tmxMap.Tilesets[k].Tiles.Count; l++)
// This line throws an error
if (tmxMap.Tilesets[k].Tiles[l].Properties != null)
// and if I remove the above line, this line throws an error
for (int m = 0; m < tmxMap.Tilesets[k].Tiles[l].Properties.Count; m++)
我得到的错误是字典中不存在给定的键。但是...我什至没有检查密钥。
我是不是漏掉了什么?
如有任何帮助,我们将不胜感激。
The error I get says The given key was not present in the dictionary. But... I'm not even checking for a key.
是的,您正在检查密钥。这是您的代码:
if (tmxMap.Tilesets[k].Tiles[l].Properties != null)
您正在使用键 k
检查 Tilesets
,然后使用键 l
检查 Tiles
。如果 Tilesets
不包含键为 k
的项目,您将收到该错误。 Tiles
键 l
.
您可以在使用词典时执行以下操作:
选项 1
查找执行了两次:一次查看该项目是否存在,然后第二次获取值:
var items = new Dictionary<string, string>();
items.Add("OneKey", "OneValue");
if(items.ContainsKey("OneKey"))
{
var val = items["OneKey"];
}
选项 2
这是另一种只执行一次查找的方法:
string tryVal;
if (items.TryGetValue("OneKey", out tryVal))
{
// item with key exists so you can use the tryVal
}
据我在您的代码中所见,我认为 Tiles 是一个字典,当您尝试按 tmxMap.Tilesets[k].Tiles[l]
进行迭代时,它会抛出错误,因为它搜索键 l,而不是 l 元素。
你可以试试tmxMap.Tilesets[k].Tiles[tmxMap.Tilesets[k].Tiles.Keys.ElementAt(l)]
您正在尝试获取基于键 k
、l
的值。
if (tmxMap.Tilesets[k].Tiles[l].Properties != null)
语句基本上是获取对应于 Tilesets
字典中的 k
键的值。如果 Tilesets
字典不包含键 k
的值,将抛出异常。另外,如果 l
键没有对应的值,在 Tiles 字典中,将抛出异常。
您可以使用 TryGetValue
扩展方法,如果找到该项目,它将为您提供值。
TileSet ts = null;
if(tmxMap.Tilesets.TryGetValue(k, out ts)
{
for (int l = 0; l < ts.Tiles.Count; l++)
{
Tiles tl = null;
if(ts.TryGetValue(l,out tl)
{
if (tl.Properties != null)
{
for (int m = 0; m < tl.Properties.Count; m++)
{
//Do something
}
}
}
}
}