如何在C#中创建包含不同类型的Dictionary

Enr*_*ico 43 c# dictionary hashtable

我需要某种方式来存储键/值对,其中值可以是不同类型.

所以我喜欢这样做:

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

 Storage.Add("age", i);
 Storage.Add("name", s);
 Storage.Add("bmi", x);
Run Code Online (Sandbox Code Playgroud)

然后用以下方法检索值:

 int a = Storage.Get("age");
 string b = Storage.Get("name");
 double c = Storage.Get("bmi");
Run Code Online (Sandbox Code Playgroud)

这样的存储应该如何?谢谢,Erik

Jon*_*eet 67

好吧,你可以Dictionary<string, dynamic>在C#4/.NET 4中使用 - 但除此之外,你不能完全使用所显示的代码,因为没有可隐式转换为的类型int,stringdouble.(您可以自己编写,但必须单独列出每种类型.)

你可以使用Dictionary<string, object>但是你需要投射结果:

int a = (int) Storage.Get("age");
string b = (string) Storage.Get("name");
double c = (double) Storage.Get("bmi");
Run Code Online (Sandbox Code Playgroud)

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

int a = Storage.Get<int>("age");
// etc
Run Code Online (Sandbox Code Playgroud)

  • @MinhTran:当然,除非您*需要*存储各种值。虽然如果你 * 可以 * 使事情类型安全是很好的,但有各种各样的情况你真的不能。 (4认同)
  • 我同意Jon Skeet的观点.再次.但做这样的事情意味着你做错了什么.您应该首先考虑为什么需要在单个字典中存储不同值的原因. (2认同)

Ste*_*eve 23

可以声明仅包含类型的Dictionary 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"];
Run Code Online (Sandbox Code Playgroud)

然而,这不是那么优雅.如果你知道你总是要存储age,name,bmi我会创建一个对象来封装那些并存储它.例如

public class PersonInfo
{
    public int Age { get; set; }
    public string Name { get; set; }
    public double Bmi { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后使用字典的插入...例如

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

int age = person1.Age;
Run Code Online (Sandbox Code Playgroud)

等等


jga*_*fin 8

为什么不使用:

Dictionary<string, object>
Run Code Online (Sandbox Code Playgroud)

您可以创建一个扩展方法来在获取它们时强制转换它们:

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");
Run Code Online (Sandbox Code Playgroud)


Joh*_*pin 5

鉴于您不想要强类型数据收集,那么我认为 aHashTable适合您的情况。您也可以为此创建一个扩展方法,就像另一张为字典实现建议的海报一样。

例如

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

您的代码将如下所示:

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");
Run Code Online (Sandbox Code Playgroud)