[英]C# Dictionary - The given key was not present in the dictionary
我目前正在嘗試將Tiled(Tiled地圖編輯器)地圖文件中的游戲對象加載到我在C#中制作的游戲引擎中。 我正在使用TiledSharp( 這里鏈接到github)。 它使用字典來保存我正在嘗試加載的每個單獨的圖塊(或“游戲對象”)的屬性。 但由於某些原因,當我遍歷屬性時出現錯誤,如果我檢查它是否為空,我也會收到錯誤
這是我正在使用的代碼片段:
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++)
我得到的錯誤說字典中沒有給定的密鑰。 但是......我甚至沒有檢查鑰匙。
我錯過了什么嗎?
任何幫助,將不勝感激。
我得到的錯誤說字典中沒有給定的密鑰。 但是......我甚至沒有檢查鑰匙。
是的,你正在檢查鑰匙。 這是你的代碼:
if (tmxMap.Tilesets[k].Tiles[l].Properties != null)
您正在使用密鑰k
檢查Tilesets
,然后使用密鑰l
檢查Tiles
。 如果Tilesets
不包含帶有鍵k
的項,則會出現該錯誤。 具有鍵l
Tiles
也是如此。
使用詞典時,您可以執行以下操作:
選項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
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.