簡體   English   中英

C#Dictionary - 字典中沒有給定的鍵

[英]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)]

您正在嘗試根據鍵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
              }
            }
          }
        }
     }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM