2010-11-05 259 views
26

我需要某種方式來存儲鍵/值對,其中的值可以是不同的類型。如何在C#中創建一個包含不同類型的字典

所以我喜歡做的事:

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

應該如何像這樣的存儲樣子:

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

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

後來與檢索值? 謝謝, 埃裏克

回答

48

嗯,你可以在C#中使用Dictionary<string, dynamic> 4/.NET 4 - 但除此之外,你不能完全代碼做顯示,因爲沒有類型的隱式轉換爲intstringdouble。 (你可以寫你自己的,但你必須單獨列出每個類型。)

你可以使用Dictionary<string, object>但隨後你需要轉換的結果:

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

或者,你可以使Get方法通用:

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

也許有人應該創建一個Variant類型?幫助,我很盲目! – 2010-11-05 11:55:54

+2

我同意Jon Skeet。再次。 但是做這樣的事情意味着你做錯了什麼。你應該首先考慮爲什麼你需要在單個字典中存儲不同值的原因。 – Euphoric 2010-11-05 11:58:07

+0

非常感謝,通用的Get方法是我一直在尋找的! – Enrico 2010-11-05 12:20:58

6

爲什麼不使用:

Dictionary<string, object> 

當你讓他們可以創建一個擴展方法來丟掉。

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

您可以使用Dictionary<string,object>,然後你就可以把你想成任何東西。當你把它們拿出來的時候,你不得不把結果轉換成正確的類型。

看看你的例子,雖然你可能想考慮一個簡單的類來存儲數據可能更多你想要的,並允許更好的類型安全。這取決於你是否有一套有限的東西放在課堂上,或者你是否需要潛在的無限/未知的字典存儲。

0

字典顯然是最快的解決方案。

另一種方式可以是存儲在其中,你可以存儲有關其類型的實際值和信息的自定義類

19

可以聲明僅包含類型object一個字典,然後投下你的結果; 。例如。

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

但是,這並不是那麼優雅。如果你知道你總是要存儲年齡,名字,bmi,我會創建一個對象來封裝這些對象,然後存儲它。例如。

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

然後使用該字典的英語...例如,

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

int age = person1.Age; 

2

鑑於您不想要強類型的數據收集,那麼我會認爲HashTable將適合您的情況。您也可以爲此創建一個Extention方法,就像爲Dictionary實現提供的另一張海報一樣。

E.g.然後

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

你的代碼是這樣:

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"); 
相關問題