2011-06-21 13 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(文字列、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); 

次の行が赤で下線が引かれて、Iそれが何で、どのように修正できるかを知る必要があるだけです!

私は自分自身で多くの研究をしてきましたが、これについて私を助けるものは何も見つかりませんでした。 辞書の辞書を作成する方法を見てきましたが、Valueにオブジェクト型を気にしないように辞書に伝える方法はよく分かりません。

私はここにいくつかの使用であるかもしれない「T」を知っているが、私は本当にそれはいつも私に語ったので、それを使用する方法がわからないので、

「型または名前空間名 『T』が見つかりませんでした」私は何をすべきか?事前 で

おかげ - サーシャ

答えて

1

問題は、あなたが作成するオブジェクトと型定義を一致させていないことです。コードを次のように変更してください。

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

あなたはすべてのタイプ情報を初心者のために保持しています!マップ、タイルセットなどにアクセスするための「固定」構造の辞書を作成しているようです。これらはゲームのファーストクラスの概念なので、型として保持するとよいでしょう。 AresAvatar(直近の問題に対する簡単な修正)は、オブジェクトを取り戻すときに、オブジェクトを元のデータ型にキャストする必要があります。あなたのコードは、どんなタイプがどの辞書キーに含まれているかの暗黙の知識を持っています。これを避け、タイプを作成し、キャスティングは必要ありません! –

関連する問題