2011-06-21 9 views
5

Jestem całkiem nowy dla C# i pochodzę z tła Ruby. Nadal mam dużo do nauczenia się i dlatego zadaję następujące pytanie:Słownik C# za pomocą TValue w innym słowniku

Cel: 1) Chciałbym utworzyć słownik z ciągiem znaków jako kluczem i dowolnym typem obiektu, który chcę jako wartości. Coś takiego:

Dictionary<string, T> 

2) Ale to nie wszystko. Chcę również słownik "Master" z ciągami znaków jako kluczami i Słownikiem opisanym powyżej jako wartości. coś takiego:

Dictionary<string, Dictionary<string T>> 

chcę go mieć w ten sposób, więc mogę pracować jak w poniższym przykładzie:

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

Aktualny Kod: Staram się to osiągnąć za pomocą następującego kodu

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); 
     } 

problem: otrzymuję następujące błędy

1) najlepszym przeciążona metoda mecz dla 'System.Collections.Generic.Dictionary> .Add (string, System.Collections.Generic.Dictionary)' ma pewne nieprawidłowe argumenty

2) Błąd 10 Argument 1: nie można przekonwertować z „System.Collections.Generic.Dictionary>” do „System.Collections.Generic.IDictionary”

Poniższe wiersze są podkreślone na czerwono

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

wyraźnie zrobił coś złego lub nawet nielegalne tutaj, tylko muszę wiedzieć, co to jest i jak mogę to naprawić!

Zrobiłem dużo badań na własną rękę, ale znalazłem nic, co mogłoby mi pomóc w tym. Widziałem, jak utworzyć słownik słowników, ale nie jestem do końca pewien, jak powiedzieć słownikowi, żeby nie dbał o typ obiektu w wartości.

wiem „T” może się przydać tutaj, ale ja naprawdę nie wiem, jak go używać, ponieważ zawsze mi mówi „typu lub obszaru nazwa«T»nie można odnaleźć”

Tak co powinienem zrobić?

góry dzięki - Sasha

Odpowiedz

1

Problem polega na tym, że nie pasujesz do twoich typedefs z tworzonymi obiektami. Zmień swój kod na:

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

Ta metoda wydaje się działać bardzo dobrze! – Sasha

3

można zmienić wszystkie dictonaries ciąg, obiekt ....

ale być może, ponieważ jesteś z Ruby, istnieje inny problem dzieje ....

umieszczanie wszystkiego w słownikach, a następnie ustalenie, jakie typy są ponownie przy wydobywaniu, może nie jest najlepszym rozwiązaniem. W wpisywanych języków, często jego mocy, aby typy na wszystko

być może byłoby lepiej mieć wpisany obiekt ze słowników typu są one ...

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

etc ...lub całkiem możliwe, z odrobiną myśli, inna struktura klasy może być bardziej odpowiednia w twojej sytuacji.

+0

Brzmi interesująco. Jakie byłyby korzyści wynikające z metody AresAvatar? – Sasha

+1

Zachowaj wszystkie informacje o typie na początek! Wygląda na to, że tworzysz "stały" słownik struktur, aby uzyskać dostęp do Map, Zestawów Tile, itp. Są to pojęcia pierwszej klasy w grach, więc dobrze byłoby zachować je jako typy. Co stanie się z AresAvatar (co jest prostą poprawką do twojego bezpośredniego problemu) to, kiedy odzyskasz obiekty, będziesz musiał je odesłać do swoich typów danych. Twój kod będzie zawierał ukrytą wiedzę o tym, jaki typ znajduje się w kluczu słownika. Unikaj tego, twórz typy, nie potrzebujesz odlewania! –

Powiązane problemy