2010-11-05 7 views
26

Ho bisogno di un modo per memorizzare coppie chiave/valore in cui il valore può essere di diversi tipi.Come posso creare un dizionario che contiene diversi tipi in C#

Così mi piace fare:

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

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

e poi recuperare i valori di:

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

Come dovrebbe una Storage come questo aspetto? Grazie, Erik

risposta

48

Beh, si potrebbe usare Dictionary<string, dynamic> in C# 4/NET 4 - ma a parte questo, non si può fare con esattamente il codice mostrato perché non c'è nessun tipo, che è implicitamente convertibile in int, string e double. (Si potrebbe scrivere uno proprio, ma che avrebbe dovuto elencare ogni tipo separatamente.)

Si potrebbe utilizzare Dictionary<string, object> ma poi avresti bisogno di lanciare i risultati:

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

In alternativa, si potrebbe rendere il metodo Get generico:

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

Forse qualcuno dovrebbe creare un tipo Variant? AIUTO, SONO VECCHIO! –

+2

Sono d'accordo con Jon Skeet. Ancora. Ma fare qualcosa del genere significa che stai facendo qualcosa di sbagliato. Dovresti innanzitutto pensare alle ragioni dietro alle quali devi memorizzare valori diversi nel dizionario singolo. – Euphoric

+0

Grazie mille, il metodo Get generico era la cosa che stavo cercando !! – Enrico

6

perché non utilizzare:

Dictionary<string, object> 

È possibile creare un metodo di estensione per lanciare loro quando li si ottiene:

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

È possibile utilizzare un Dictionary<string,object> e poi si può mettere tutto quello che vuoi in esso. Dovresti trasmettere i risultati al tipo giusto quando li fai uscire.

Osservando il tuo esempio, dovresti considerare se una semplice classe per archiviare i dati potrebbe essere più quella che desideri e consentire una migliore sicurezza dei tipi. Dipende se hai una serie limitata di cose da mettere in classe o se hai bisogno della memorizzazione potenzialmente illimitata/sconosciuta di un dizionario.

0

Il dizionario è chiaramente la soluzione più rapida.

Un altro modo potrebbe essere quello di memorizzare una classe personalizzata in cui è possibile memorizzare il valore reale e le informazioni riguardanti il ​​tipo

19

È potrebbe dichiarare un dizionario contenente solo il tipo object e poi gettato i risultati; .per esempio.

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"]; 

Tuttavia, questo non è elegante. Se sai che accumuli sempre età, nome, bmi, creo un oggetto per incapsularlo e memorizzarlo. Per esempio.

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

E quindi utilizzare quella versione del dizionario ... ad es.

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

int age = person1.Age; 

ecc.

2

Dato che non si desidera una raccolta dati fortemente tipizzata, avrei pensato che uno HashTable sarebbe adatto alla situazione. Potresti anche creare un metodo di estensione per questo, come un altro poster suggerito per l'implementazione del dizionario.

E.g.

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

Il tuo codice sarebbe quindi simile:

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"); 
Problemi correlati