簡體   English   中英

如何在 C# 中創建一個包含不同類型的字典

[英]How do I create a Dictionary that holds different types in C#

我需要某種方式來存儲鍵/值對,其中值可以是不同類型。

所以我喜歡這樣做:

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

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

然后使用以下方法檢索值:

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

這樣的存儲應該是什么樣子的? 謝謝,埃里克

好吧,您可以在 C# 4 / .NET 4 中使用Dictionary<string, dynamic> - 但除此之外,您不能完全使用顯示的代碼來執行此操作,因為沒有可以隱式轉換為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

可以聲明一個只包含類型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"];

然而,這並不是那么優雅。 如果你知道你總是要存儲年齡、姓名、體重,我會創建一個對象來封裝這些並存儲它們。 例如

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

然后使用字典的 insead ......例如

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

int age = person1.Age;

等等。

為什么不使用:

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

鑒於您不想要強類型數據集合,那么我會認為HashTable適合您的情況。 您也可以為此創建一個擴展方法,就像為 Dictionary 實現建議的另一張海報一樣。

例如

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");
Dictionary<string, object>

也許這是一個老問題,但我正在向來這里尋找答案的人講話

如果值不是固定類型的選擇之一是使用Hashtable請查看 Dictionary 和 Hashtable 的實現

 public class Dictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, IDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IReadOnlyDictionary<TKey, TValue>, ICollection, IDictionary, IDeserializationCallback, ISerializable { ... }

 public class Hashtable : ICollection, IEnumerable, IDictionary, ISerializable, IDeserializationCallback, ICloneable { ... }

從上面的代碼片段中可以更清楚地看出,兩者都實現了字面上相同的接口,但在 Hashtable 中,鍵和值都沒有類型,因為它們都被認為是本質上的對象,例如,您可以從 Hashtable 中的 add 方法中看到:

 public virtual void Add(object key, object value);

因此,對於沒有固定鍵和/或值的情況,我建議使用 Hashtable,因此您不再需要添加額外的擴展方法或覆蓋字典的默認行為。

你可以使用Dictionary<string,object>然后你可以把任何你想要的東西放進去。 但是,當您將它們取出時,您必須將結果轉換為正確的類型。

看看你的例子,雖然你可能想考慮一個簡單的類來存儲數據是否可能更符合你的需求並允許更好的類型安全。 這取決於您是否有一組有限的東西可以放入類中,或者您是否確實需要字典的潛在無限/未知存儲。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM