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 的项目,您将收到该错误。 Tilesl.

也是如此

您可以在使用词典时执行以下操作:

选项 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)]

您正在尝试获取基于键 kl 的值。

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
              }
            }
          }
        }
     }