79

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

这只是传递数据的简单分流。

4

8 回答 8

140

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

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");
于 2008-08-12T13:20:55.127 回答
13

您可以做的一件可能的事情是直接使用 Dictionary 对象,然后使用您自己的修改对其进行扩展:

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

这使您不必为您的密钥强制执行 IDictionary 规则(例如,密钥唯一性等)。

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

于 2008-08-12T13:25:12.903 回答
7

我认为您可能追求的(作为您问题的文字实现)是:

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

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

您实际上确实在问题中说了一个键值的“列表”,因此您可能希望将内部IDictionary替换为:

IList<KeyValuePair<string, string>>
于 2008-08-12T13:45:53.470 回答
5

有一个 KeyValuePair 内置类型。事实上,这就是 IDictionary 在迭代时为您提供的访问权限。

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

于 2008-08-12T13:23:27.777 回答
3

只需添加一件事(尽管我确实认为您的问题已经得到其他人的回答)。出于可扩展性的考虑(因为我们都知道它会在某个时候发生),您可能需要查看复合模式,这是使用“树状结构”的理想选择。

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

于 2008-08-12T13:45:50.210 回答
2

@ Jay Mooney:.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 使用泛型类型,因此更好。

于 2008-08-12T13:25:56.710 回答
1

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

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

于 2008-08-12T13:22:01.287 回答
1

使用这样的东西:

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

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

于 2008-08-12T13:38:47.243 回答