2011-06-21 69 views
5

我對C#相當陌生,我來自Ruby背景。我仍然有很多東西要學習,這就是爲什麼我要問以下問題:C#字典在另一個詞典中使用TValue

目標: 1)我想創建一個字符串作爲鍵和任何對象類型我想要的值的字典。類似這樣的:

Dictionary<string, T> 

2)但這並不是全部。我還想要一個以字符串作爲關鍵字的「主」字典和上面描述的字典作爲值。 事情是這樣的:

Dictionary<string, Dictionary<string T>> 

我希望它是這樣,所以我可以工作,如下面的例子:

MasterDictionary[Dict1].Add(Thing1) 
MasterDictionary[Dict2].Add(Thing2) 

目前代碼: 我試圖做到這一點使用下面的代碼

public List<string> DataTypes; 
public Dictionary<string, Dictionary<string, object>> TempData; 
public Dictionary<string, Dictionary<string, object>> GameData; 

public Session() 
     { 
      // Create a list of all Data Types. 
      DataTypes = new List<string>(); 
      DataTypes.Add("DataInfo"); 
      DataTypes.Add("Maps"); 
      DataTypes.Add("Tilesets"); 

      // Create and populate TempData dictionary. 
      TempData = new Dictionary<string, Dictionary<string, object>>(); 
      TempData.Add("DataInfo", new Dictionary<string, DataInfo>()); 
      TempData.Add("Maps", new Dictionary<string, Map>()); 
      TempData.Add("Tilesets", new Dictionary<string, Tileset>()); 

      // Create GameData dictionary and copy TempData into it. 
      GameData = new Dictionary<string, object>(TempData); 
     } 

問題: 我收到以下錯誤

1)'System.Collections.Generic.Dictionary> .Add(string,System.Collections.Generic.Dictionary)'的最佳重載方法匹配有一些無效參數

2)錯誤10參數1:無法轉換從「System.Collections.Generic.Dictionary>」到「System.Collections.Generic.IDictionary」

以下行紅色下劃線

TempData.Add("DataInfo", new Dictionary<string, DataInfo>()); 
TempData.Add("Maps", new Dictionary<string, Map>()); 
TempData.Add("Tilesets", new Dictionary<string, Tileset>()); 

// Create GameData dictionary and copy TempData into it. 
GameData = new Dictionary<string, object>(TempData); 

我明明做錯了什麼事,甚至非法這裏,我只需要知道它是什麼以及我如何修復它!

我一直在做我自己的很多研究,但沒有發現任何可以幫助我的事情。 我已經看過如何製作字典詞典,但我不太清楚如何告訴字典不要關心Value中的對象類型。

我知道「T」可能是一些使用在這裏,但我真的不知道如何使用它,因爲它總是告訴我「的類型或命名空間名稱‘T’找不到」

所以我該怎麼辦?

預先感謝 - 薩沙

回答

1

問題是,您沒有將您的typedefs與您創建的對象相匹配。將您的代碼更改爲:

public void Session() 
{ 
    // Create a list of all Data Types. 
    DataTypes = new List<string>(); 
    DataTypes.Add("DataInfo"); 
    DataTypes.Add("Maps"); 
    DataTypes.Add("Tilesets"); 

    // Create and populate TempData dictionary. 
    TempData = new Dictionary<string, Dictionary<string, object>>(); 
    TempData.Add("DataInfo", new Dictionary<string, object>()); 
    TempData.Add("Maps", new Dictionary<string, object>()); 
    TempData.Add("Tilesets", new Dictionary<string, object>()); 

    // Create GameData dictionary and copy TempData into it. 
    GameData = new Dictionary<string, Dictionary<string, object>>(TempData); 
} 
+0

這種方法似乎工作得很好! – Sasha

3

你可以將所有dictonaries更改爲字符串,對象....

但也許,因爲你是從紅寶石,還有回事另一個問題....

將所有東西都放入字典中,然後在提取時再次確定它們是什麼類型可能不是最好的方法。在類型語言,它通常最好讓類型一切

也許會有更好的與他們的類型的字典一個類型的對象......

class GameResources 
{ 
    public Dictionary<string, Map> Maps { get; set;} 
    public Dictoinary<string, Tileset> Tileset { get; set; } 
} 

等..或者很可能有點想法,另一個類結構可能更適合您的情況

+0

聽起來很有趣。 AresAvatar方法的優點是什麼? – Sasha

+1

你保留了初學者的所有類型信息!看起來你正在製作一個「固定」結構字典來訪問Maps,Tilesets等。這些是遊戲中的第一類概念,所以將它們保存爲類型是很好的。 AresAvatar會發生什麼(這是解決您的直接問題的簡單方法)是當您將對象返回時,您將不得不將它們轉換回它們的數據類型。你的代碼將隱含知道什麼類型是什麼字典的關鍵。避免這種情況,創建類型,不需要鑄造! –