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

78,477

Solution 1

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

Solution 2

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.

Solution 3

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

Solution 4

Given that you don't want a strongly typed data collection then I would have thought a HashTable would be suitable for your situation. You could create an Extention method for this also, like another poster suggested for the Dictionary implementation.

E.g.

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

Your code would then look like:

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

Solution 5

Dictionary<string, object>
Share:
78,477
Enrico
Author by

Enrico

Updated on July 08, 2022

Comments

  • Enrico
    Enrico almost 2 years

    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";
     double x = 24.1;
    
     Storage.Add("age", i);
     Storage.Add("name", s);
     Storage.Add("bmi", x);
    

    And later retrieve the values with:

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

    How should a Storage like this look like? Thanks, Erik