using System.Collections.Generic;
public static void Main()
var myDict = new MultiKeyDictionary<string, double, double, string>
{"Goodbye", 0.55, 9.00, "yaya"}
myDict.Add("Hello", 1.11, 2.99, "hi");
Console.WriteLine(myDict.ContainsKey("Hello", 1.11, 2.99));
Console.WriteLine(myDict.ContainsKey("a", 1.11, 2.99));
Console.WriteLine(myDict["Hello", 1.11, 2.99]);
public struct TripleKey<TKeyA, TKeyB, TKeyC>
private readonly TKeyA _keyA;
private readonly TKeyB _keyB;
private readonly TKeyC _keyC;
public TKeyA KeyA => _keyA;
public TKeyB KeyB => _keyB;
public TKeyC KeyC => _keyC;
public TripleKey(TKeyA keyA, TKeyB keyB, TKeyC keyC)
public override string ToString()
var sBuilder = new StringBuilder();
sBuilder.Append(KeyA.ToString());
sBuilder.Append(KeyB.ToString());
sBuilder.Append(KeyC.ToString());
return sBuilder.ToString();
public static class TripleKey
public static TripleKey<TKeyA, TKeyB, TKeyC> Create<TKeyA, TKeyB, TKeyC>(TKeyA keyA, TKeyB keyB, TKeyC keyC)
return new TripleKey<TKeyA, TKeyB, TKeyC>(keyA, keyB, keyC);
public class MultiKeyDictionary<TKeyA, TKeyB, TKeyC, TValue> : Dictionary<TripleKey<TKeyA, TKeyB, TKeyC>, TValue>
public TValue this[TKeyA keyA, TKeyB keyB, TKeyC keyC]
var key = TripleKey.Create(keyA, keyB, keyC);
return base.ContainsKey(key) ? base[key] : default(TValue);
var key = TripleKey.Create(keyA, keyB, keyC);
public bool ContainsKey(TKeyA keyA, TKeyB keyB, TKeyC keyC)
var key = TripleKey.Create(keyA, keyB, keyC);
return base.ContainsKey(key);
public void Add(TKeyA keyA, TKeyB keyB, TKeyC keyC, TValue value)
base.Add(TripleKey.Create(keyA, keyB, keyC), value);