2017-04-08 448 views
1

我目前正在尝试从Tiled(平铺地图编辑器)地图文件中将游戏对象加载到我在C#中制作的游戏引擎中。我使用TiledSharp(链接到GitHub的here)。它使用字典来记录每一个单独的瓷砖(或“游戏对象”),我试图加载性能。但由于某些原因,我得到一个错误,当我遍历性,同时我也得到一个错误,如果我检查它是否是空C#字典 - 给定的关键字不存在于字典中

下面是我使用的代码片段:

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++) 

的错误我收到说给定的关键是不存在的字典。但是...我甚至没有检查钥匙。

我错过了什么吗?

任何帮助,将不胜感激。

+0

_“我甚至没有检查钥匙” - - 但你是。我猜'瓷砖[l]'抛出。为什么这取决于你如何声明和初始化字典。可能你只是在寻找'foreach(var tile in tmxMap.Tilesets [k] .Tiles)'? – CodeCaster

+0

从那时起,我可以通过在tile循环中执行另一个foreach循环来访问每个tile的属性,但这对我来说看起来很愚蠢,必须有更好的方法。 –

回答

4

我得到的错误说给定的键不在字典中。但是...我甚至没有检查钥匙。

是你检查的关键。这是你的代码:

if (tmxMap.Tilesets[k].Tiles[l].Properties != null) 

您与关键k检查Tilesets,然后用钥匙l检查。如果Tilesets不包含关键k一个项目,你会得到错误。这同样适用于与关键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 
} 
0

至于我可以在你的代码中看到的我认为瓷砖是一本字典,当你尝试通过tmxMap.Tilesets[k].Tiles[l]迭代,因为它搜索抛出错误键l,而不是l元素。

您可以尝试tmxMap.Tilesets[k].Tiles[tmxMap.Tilesets[k].Tiles.Keys.ElementAt(l)]

0

你试图让基于密钥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 
       } 
      } 
      } 
     } 
    }