2011-06-21 28 views
5

Soy bastante nuevo en C# y vengo de un fondo Ruby. Todavía tengo mucho que aprender y es por eso que estoy haciendo la siguiente pregunta:C# Dictionary usando TValue dentro de otro Dictionary

Objetivo: 1) Me gustaría crear un diccionario con cadena como claves y cualquier tipo de objeto que desee como valores. Algo como esto:

Dictionary<string, T> 

2) Pero eso no es todo. También quiero un diccionario "maestro" con cadenas como claves y el diccionario descrito anteriormente como valores. Algo como esto:

Dictionary<string, Dictionary<string T>> 

quiero que sea de esa manera por lo que puede funcionar como el ejemplo siguiente:

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

Código actual: que estoy tratando de lograr esto usando el siguiente código

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

Problema: consigo los siguientes errores

1) El partido mejor método para sobrecargada 'System.Collections.Generic.Dictionary> .Add (cadena, System.Collections.Generic.Dictionary)' tiene algunos argumentos no válidos

2) Error 10 Argumento 1: no se puede convertir de 'System.Collections.Generic.Dictionary>' a 'System.Collections.Generic.IDictionary'

Las siguientes líneas están subrayados en rojo

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

hice claramente algo mal o incluso ilegal aquí, solo necesito saber de qué se trata y cómo podría solucionarlo.

He estado investigando mucho por mi cuenta, pero no he encontrado nada que pueda ayudarme en esto. He visto cómo hacer un diccionario de diccionarios, pero no estoy muy seguro de cómo decirle a un diccionario que no se preocupe por el tipo de objeto en Valor.

que sé "T" puede ser de alguna utilidad aquí, pero no se sabe muy bien cómo usarlo, ya que siempre me dice "El tipo o espacio de nombres 'T' no se pudo encontrar"

Así ¿que debería hacer?

Gracias de antemano - Sasha

Respuesta

1

El problema es que no está haciendo coincidir sus typedefs con los objetos que crea. Cambie su código a este:

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

¡Este método parece funcionar muy bien! – Sasha

3

podría cambiar todos los dictonaries de cadena, objeto ....

pero tal vez, ya que son de Ruby, hay otro problema pasando ....

poner todo en los diccionarios y luego tener que averiguar qué tipos son de nuevo al extraer quizás no sea el mejor enfoque. En lenguajes de tipo, a menudo su mejor esfuerzo para hacer todo tipo de

tal vez sería mejor tener un objeto escrito con los diccionarios del tipo que son ...

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

etc ...o muy posiblemente con un poco de pensamiento, otra estructura de clases podría ser más apropiada en su situación

+0

Suena interesante. ¿Cuáles serían los beneficios sobre los métodos de AresAvatar? – Sasha

+1

guarda toda la información del tipo para empezar! Parece que estás creando un diccionario de estructura "fijo" para acceder a Maps, Tilesets, etc. Estos son conceptos de primera clase en los juegos, por lo que sería bueno mantenerlos como tipos. ¿Qué va a pasar con AresAvatar (que es la solución simple para su problema inmediato) cuando recupera los objetos, tendrá que devolverlos a su tipo de datos? Su código va a tener conocimiento implícito de qué tipo está en qué clave de diccionario. Evita esto, crea tipos, ¡no se necesita moldear! –