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

前端 未结 8 399
庸人自扰
庸人自扰 2020-12-04 21:38

I need some sort of way to store key/value pairs where the value can be of different types.

So I like to do:

 int i = 12;
 string s = \"test\";
 doub         


        
相关标签:
8条回答
  • 2020-12-04 21:43

    You can use a Dictionary<string,object> and then you can put anything you want into it. You would have to cast the results to the right type when you get them out though.

    Looking at your example though you might want to consider whether a simple class to store the data might be more what you want and allow better type safety. It depends on whether you have a limited set of things to put in the class or if you do need the potentially unlimited/unknown storage of a dictionary.

    0 讨论(0)
  • 2020-12-04 21:50

    Why not use:

    Dictionary<string, object>
    

    You can create an extension method to cast them when you get them:

    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");
    
    0 讨论(0)
  • Well, you could use Dictionary<string, dynamic> in C# 4 / .NET 4 - but other than that, you can't do it with exactly the code shown because there's no type which is implicitly convertible to int, string and double. (You could write your own one, but you'd have to list each type separately.)

    You could use Dictionary<string, object> but then you'd need to cast the results:

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

    Alternatively, you could make the Get method generic:

    int a = Storage.Get<int>("age");
    // etc
    
    0 讨论(0)
  • 2020-12-04 21:59
    Dictionary<string, object>
    
    0 讨论(0)
  • 2020-12-04 22:03

    You could declare a Dictionary containing just the type object and then cast your results; .e.g.

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

    However, this isn't that elegant. If you know you are always going to be storing age, name, bmi I would create an object to encapsulate those and store that instead. E.g.

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

    And then use that insead of the Dictionary... e.g.

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

    etc.

    0 讨论(0)
  • 2020-12-04 22:04

    maybe it is an old question, but I am addressing the guys who come here to find the answer

    if the value is not a fixed type one of the choices is using Hashtable please look at the implementation of both Dictionary and 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
      {
       ...
      }

    as it gets more clear from above code snippets, both implement literally the same interfaces but in Hashtable there is no type on both key & value since both of them considered to be intrinsically objects, for example you can see from add method in Hashtable:

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

    so for the cases of not having fixed keys and/or values, I recommend using Hashtable, therefore you don't need to add extra extension methods or override default behavior of a dictionary any more.

    0 讨论(0)
提交回复
热议问题