Multi value Dictionary
C#C# Problem Overview
How would i create a multi value Dictionary in c#?
E.g. Dictionary<T,T,T>
where the first T is the key and other two are values.
so this would be possible: Dictionary<int,object,double>
Thanks
C# Solutions
Solution 1 - C#
If you are trying to group values together this may be a great opportunity to create a simple struct or class and use that as the value in a dictionary.
public struct MyValue
{
public object Value1;
public double Value2;
}
then you could have your dictionary
var dict = new Dictionary<int, MyValue>();
you could even go a step further and implement your own dictionary class that will handle any special operations that you would need. for example if you wanted to have an Add method that accepted an int, object, and double
public class MyDictionary : Dictionary<int, MyValue>
{
public void Add(int key, object value1, double value2)
{
MyValue val;
val.Value1 = value1;
val.Value2 = value2;
this.Add(key, val);
}
}
then you could simply instantiate and add to the dictionary like so and you wouldn't have to worry about creating 'MyValue' structs:
var dict = new MyDictionary();
dict.Add(1, new Object(), 2.22);
Solution 2 - C#
Just create a Pair<TFirst, TSecond>
type and use that as your value.
I have an example of one in my C# in Depth source code. Reproduced here for simplicity:
using System;
using System.Collections.Generic;
public sealed class Pair<TFirst, TSecond>
: IEquatable<Pair<TFirst, TSecond>>
{
private readonly TFirst first;
private readonly TSecond second;
public Pair(TFirst first, TSecond second)
{
this.first = first;
this.second = second;
}
public TFirst First
{
get { return first; }
}
public TSecond Second
{
get { return second; }
}
public bool Equals(Pair<TFirst, TSecond> other)
{
if (other == null)
{
return false;
}
return EqualityComparer<TFirst>.Default.Equals(this.First, other.First) &&
EqualityComparer<TSecond>.Default.Equals(this.Second, other.Second);
}
public override bool Equals(object o)
{
return Equals(o as Pair<TFirst, TSecond>);
}
public override int GetHashCode()
{
return EqualityComparer<TFirst>.Default.GetHashCode(first) * 37 +
EqualityComparer<TSecond>.Default.GetHashCode(second);
}
}
Solution 3 - C#
Dictionary<T1, Tuple<T2, T3>>
Edit: Sorry - I forgot you don't get Tuples until .NET 4.0 comes out. D'oh!
Solution 4 - C#
I think this is quite overkill for a dictionary semantics, since dictionary is by definition is a collection of keys and its respective values, just like the way we see a book of language dictionary that contains a word as the key and its descriptive meaning as the value.
But you can represent a dictionary that can contain collection of values, for example:
Dictionary<String,List<Customer>>
Or a dictionary of a key and the value as a dictionary:
Dictionary<Customer,Dictionary<Order,OrderDetail>>
Then you'll have a dictionary that can have multiple values.
Solution 5 - C#
I don't think you can do that directly. You could create a class containing both your object
and double
and put an instance of it in the dictionary though.
class Pair
{
object obj;
double dbl;
}
Dictionary<int, Pair> = new Dictionary<int, Pair>();
Solution 6 - C#
If the values are related, why not encapsulate them in a class and just use the plain old Dictionary?
Solution 7 - C#
I know this is an old thread, but - since it's not been mentioned this works
Dictionary<string, object> LookUp = new Dictionary<string, object>();
LookUp.Add("bob", new { age = "23", height = "2.1m", weight = "110kg"});
LookUp.Add("jasper", new { age = "33", height = "1.75m", weight = "90kg"});
foreach(KeyValuePair<string, object> entry in LookUp )
{
object person = entry.Value;
Console.WriteLine("Person name:" + entry.Key + " Age: " + person.age);
}
Solution 8 - C#
You describe a multimap.
You can make the value a List
Override the dictionary object.
Solution 9 - C#
I solved Using:
Dictionary<short, string[]>
Like this
Dictionary<short, string[]> result = new Dictionary<short, string[]>();
result.Add(1,
new string[]
{
"FirstString",
"Second"
}
);
}
return result;
Solution 10 - C#
Here is an implementation of a single key to multi value map in C# which uses a set based key type:
https://github.com/ColmBhandal/CsharpExtras/blob/master/CsharpExtras/Dictionary/MultiValueMapImpl.cs
The dictionary behaves like a regular dictionary from the key type onto a set of the value type, but also provides functionality to directly add a single value of the value type, and in the background handles the creation of an underlying set and/or addition to that set.