关键值对数据结构的最佳实现?

所以我最近一直在用C#开发,所有的generics集合都让我有点困惑。 假设我想要表示一个数据结构,其中树的头部是一个关键值对,然后在这个关键值对下面有一个可选的列表(但不多于这些关键值)。 这会适合吗?

public class TokenTree { public TokenTree() { /* I must admit to not fully understanding this, * I got it from msdn. As far as I can tell, IDictionary is an * interface, and Dictionary is the default implementation of * that interface, right? */ SubPairs = new Dictionary<string, string>(); } public string Key; public string Value; public IDictionary<string, string> SubPairs; } 

这只是一个传递数据的简单分stream。

有一个名为KeyValuePair的实际数据types,像这样使用

 KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue"); 

你可以做的一件事是直接使用Dictionary对象,然后用你自己的修改来扩展它:

 public class TokenTree : Dictionary<string, string> { public IDictionary<string, string> SubPairs; } 

这为您提供了不必为您的密钥强制实施IDictionary规则的优势(例如密钥唯一性等)。

而且你有构造函数的概念:)

我想你以后可能会(作为你的问题的字面实现)是:

 pubic class TokenTree { public TokenTree() { tree = new Dictionary<string, IDictionary<string,string>>(); } IDictionary<string, IDictionary<string, string>> tree; } 

你确实在你的问题中说了一个键值的“列表”,所以你可能想把内部的IDictionary换成:

 IList<KeyValuePair<string, string>> 

有一个KeyValuePair内置types。 事实上,这是IDictionary在迭代时可以访问的内容。

而且,这个结构几乎不是一棵树,找一个更具代表性的名字可能是一个很好的练习。

只有一件事要补充(虽然我认为你已经有其他人回答你的问题)。 为了可扩展性(因为我们都知道它会在某个时候发生),您可能需要查看复合模式。这是使用“树状结构”的理想select。

就像我说的,我知道你只是期待一个子层次,但是如果你以后需要扩展^ _ ^

@ Jay Mooney :.NET中的genericsDictionary类实际上是一个哈希表,只是固定的types。

你所显示的代码不应该说服任何人使用Hashtable而不是Dictionary,因为两个代码段都可以用于这两种types。

对于哈希表:

 foreach(object key in h.keys) { string keyAsString = key.ToString(); // btw, this is unnecessary string valAsString = h[key].ToString(); System.Diagnostics.Debug.WriteLine(keyAsString + " " + valAsString); } 

字典:

 foreach(string key in d.keys) { string valAsString = d[key].ToString(); System.Diagnostics.Debug.WriteLine(key + " " + valAsString); } 

而对于另一个与KeyValuePair相同的,只使用Hashtable的非generics版本和Dictionary的通用版本。

因此,这两种方法一样简单,但是Hashtable对于键和值都使用Object,这意味着您将包装所有的值types,而且您没有types安全性,Dictionary使用genericstypes,因此更好。

Dictionary Class正是你想要的,正确的。

您可以直接将字段声明为Dictionary,而不是IDictionary,但这取决于您。

使用这样的东西:

 class Tree < T > : Dictionary < T, IList< Tree < T > > > { } 

这很丑,但我认为它会给你你想要的。 太糟糕KeyValuePair是密封的。