多值词典

我将如何在C#中创build一个多值字典?

例如Dictionary<T,T,T> ,其中第一个T是关键字,另外两个是值。

所以这将是可能的: Dictionary<int,object,double>

谢谢

8 Solutions collect form web for “多值词典”

只需创build一个Pair<TFirst, TSecond>types并将其用作您的值。

我在C#深度源代码中有一个例子。 为简单起见,转载于此:

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

如果你试图将值分组在一起,这可能是一个很好的机会来创build一个简单的结构或类,并将其用作字典中的值。

 public struct MyValue { public object Value1; public double Value2; } 

那么你可以有你的字典

 var dict = new Dictionary<int, MyValue>(); 

你甚至可以更进一步,实现你自己的字典类,它将处理你需要的任何特殊操作。 例如,如果你想有一个接受int,object和double的Add方法

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

那么你可以简单地实例化和添加到这样的字典,你不必担心创build“MyValue”结构:

 var dict = new MyDictionary(); dict.Add(1, new Object(), 2.22); 
 Dictionary<T1, Tuple<T2, T3>> 

编辑:对不起 – 我忘了你没有得到元组,直到NET 4.0出来。 D'哦!

我认为这对于字典语义来说是相当矫枉过正的,因为字典在定义上是一个键和它的各自的值的集合,就像我们看到一本包含一个词作为关键词的语言词典和它的描述性含义一样值。

但是您可以表示一个可以包含值集合的字典,例如:

 Dictionary<String,List<Customer>> 

或者一个关键字的字典和作为字典的值:

 Dictionary<Customer,Dictionary<Order,OrderDetail>> 

然后你会有一个可以有多个值的字典。

我不认为你可以直接做到这一点。 你可以创build一个包含你的objectdouble的类,然后把它的一个实例放在字典中。

 class Pair { object obj; double dbl; } Dictionary<int, Pair> = new Dictionary<int, Pair>(); 

如果这些值是相关的,为什么不把它们封装在一个类中,只是使用普通的旧字典?

你描述一个multimap。

您可以将该值设置为List对象,以存储多个值(> 2以实现可扩展性)。

覆盖字典对象。

我解决了使用:

 Dictionary<short, string[]> 

喜欢这个

 Dictionary<short, string[]> result = new Dictionary<short, string[]>(); result.Add(1, new string[] { "FirstString", "Second" } ); } return result;