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

所以我最近一直在使用 C # ,所有的通用集合都让我感到有点困惑。假设我想要表示一个数据结构,其中树的头是一个键值对,然后在这个值对之下有一个可选的键值对列表(但不会比这些级别更多)。这样合适吗?

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

它只是一个传递数据的简单分流器。

202159 次浏览

有一个名为 KeyValuePair 的实际数据类型,如下所示

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

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

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

有一个内置的 KeyValuePair 类型。事实上,这就是当您在 IDictionary 中迭代时可以访问的内容。

此外,这种结构几乎不是一棵树,找到一个更具代表性的名称可能是一个很好的练习。

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

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

这样做的好处是不必强制执行密钥的 IDictionary 规则(例如,密钥唯一性等)。

没错,您已经正确理解了构造函数的概念:)

@ Jay Mooney: .NET 中的一般 Dictionary 类实际上是一个散列表,只有固定的类型。

您展示的代码不应该说服任何人使用 Hashtable 而不是 Dictionary,因为两个代码片段都可以用于这两种类型。

对于 hashtable:

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 使用非通用版本,对 Dictionary 使用通用版本。

所以这两种方法都很简单,但是 Hashtable 对键和值都使用 Object,这意味着您将打包所有的值类型,并且没有类型安全,而 Dictionary 使用泛型类型,因此更好。

使用这样的东西:

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

这是丑陋的,但我认为它会给你你想要的。可惜键值对是密封的。

还有一件事要补充(尽管我确实认为你的问题已经得到了其他人的回答)。出于对可扩展性的兴趣(因为我们都知道它将在某个时候发生) ,您可能想检查一下 组合模式,这是使用“树状结构”的理想选择。.

正如我所说的,我知道您只需要一个子级别,但是如果您以后需要扩展 ^ _ ^ ,那么这将非常有用

我认为你可能想要的(作为你问题的字面实现)是:

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


IDictionary<string, IDictionary<string, string>> tree;
}

实际上,您在问题中提到了一个键值“列表”,因此您可能需要将内部 IDictionary与:

IList<KeyValuePair<string, string>>