所以我最近一直在研究 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;
}

这实际上只是一个用于传递数据的简单分流器。

有帮助吗?

解决方案

有一个实际的数据类型称为 KeyValuePair,像这样使用

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

其他提示

您可以做的一件事是直接使用开箱即用的 Dictionary 对象,然后通过您自己的修改来扩展它:

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

这给您带来的好处是不必为您的密钥强制执行 IDictionary 规则(例如,密钥唯一性等)。

是的,您正确理解了构造函数的概念:)

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

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

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

您实际上确实在问题中说了一个键值“列表”,所以您可能想要交换内部 IDictionary 与:

IList<KeyValuePair<string, string>>

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

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

只需要补充一件事(尽管我确实认为其他人已经回答了您的问题)。为了可扩展性(因为我们都知道它会在某个时候发生),您可能需要查看 复合图案 这是处理“树状结构”的理想选择。

就像我说的,我知道您只期望一个子级别,但是如果您以后需要扩展,这对您来说确实很有用^_^

@杰·穆尼: :.NET 中的通用 Dictionary 类实际上是一个哈希表,只是具有固定类型。

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

对于哈希表:

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 使用泛型类型,因此更好。

词典类 正是你想要的,正确的。

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

使用这样的东西:

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

它很丑,但我认为它会给你你想要的。可惜 KeyValuePair 被密封了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top