2010-11-05 14 views
26

? Necesito algún tipo de forma de almacenar pares clave/valor donde el valor puede ser de diferentes tipos.¿Cómo creo un diccionario que contiene diferentes tipos en C#

Así me gusta hacer:

int i = 12; 
string s = "test"; 
double x = 24.1; 

Storage.Add("age", i); 
Storage.Add("name", s); 
Storage.Add("bmi", x); 

Y más tarde recuperar los valores con:

int a = Storage.Get("age"); 
string b = Storage.Get("name"); 
double c = Storage.Get("bmi"); 

¿Cómo debería un almacenamiento como esto parece? Gracias, Erik

Respuesta

48

Bueno, usted podría utilizar Dictionary<string, dynamic> en C# 4/NET 4 - pero aparte de eso, no se puede hacer con exactamente el código que se muestra porque no hay tipo que es convertir implícitamente a int, string y double. (Se puede escribir su propio uno, pero usted tendría que enumerar cada tipo por separado.)

Usted podría utilizar Dictionary<string, object> pero entonces que había necesidad de emitir los resultados:

int a = (int) Storage.Get("age"); 
string b = (string) Storage.Get("name"); 
double c = (double) Storage.Get("bmi"); 

Alternativamente, usted podría hacer que el método Get genérica:

int a = Storage.Get<int>("age"); 
// etc 
+0

Quizás alguien debería crear un tipo Variant? AYUDA, ¡ESTOY CIEGO! –

+2

Estoy de acuerdo con Jon Skeet. De nuevo. Pero hacer algo como esto significa que estás haciendo algo mal. Primero debe pensar en las razones detrás de por qué necesita almacenar diferentes valores en un solo diccionario. – Euphoric

+0

¡Muchas gracias, el método genérico Get fue lo que estaba buscando! – Enrico

6

Por qué no usar:

Dictionary<string, object> 

Puede crear un método de extensión para echarlos cuando los reciba:

public static class DictionaryExcetions 
{ 
    public static T Get<T>(this Dictionary<string, object> instance, string name) 
    { 
     return (T)instance[name]; 
    } 

} 

var age = dictionary.Get<int>("age"); 
2
Dictionary<string, object> 
1

Puede utilizar un Dictionary<string,object> y luego se puede poner lo que quieras en ella. Sin embargo, tendrías que arrojar los resultados al tipo correcto cuando los sacaras.

En cuanto a su ejemplo, es posible que desee considerar si una clase simple para almacenar los datos podría ser más de lo que desea y permitir un mejor tipo de seguridad. Depende de si tiene un conjunto limitado de cosas para poner en la clase o si necesita el almacenamiento potencialmente ilimitado/desconocido de un diccionario.

0

Diccionario es claramente la solución más rápida.

Otra forma podría ser para almacenar una clase personalizada en la que se podría almacenar el valor real y la información referente a su tipo

19

Usted podría declarar un diccionario que contiene sólo el tipo object y luego emitir sus resultados; .p.ej.

Dictionary<string, object> storage = new Dictionary<string,object>(); 

storage.Add("age", 12); 
storage.Add("name", "test"); 
storage.Add("bmi", 24.1); 

int a = (int)storage["age"]; 
string b = (string)storage["name"]; 
double c = (double)storage["bmi"]; 

Sin embargo, esto no es tan elegante. Si sabes que siempre vas a almacenar edad, nombre, bmi, crearía un objeto para encapsularlos y almacenarlos. P.ej.

public class PersonInfo 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
    public double Bmi { get; set; } 
} 

Y a continuación, utilice ese insead del Diccionario ... p. Ej.

PersonInfo person1 = new PersonInfo { Name = "test", Age = 32, Bmi = 25.01 }; 

int age = person1.Age; 

etc.

2

Dado que no desea una colección de datos fuertemente tipados, entonces habría pensado que un HashTable sería adecuado para su situación. También podría crear un método de extensión para esto, como otro póster sugerido para la implementación del diccionario.

E.g.

public static class StorageExtentions 
{ 
    public static T Get<T>(this Hashtable table, object key) 
    { 
     return (T) table[key]; 
    } 
} 

Su código sería el siguiente aspecto:

int i = 12; 
string s = "test"; 
double x = 24.1; 
Hashtable Storage = new Hashtable(); 
Storage.Add("age", i); 
Storage.Add("name", s); 
Storage.Add("bmi", x); 
int a = Storage.Get<int>("age"); 
string b = Storage.Get<string>("name"); 
double c = Storage.Get<double>("bmi"); 
Cuestiones relacionadas