关于c#:关键值对数据结构的最佳实现?

关于c#:关键值对数据结构的最佳实现?

Best implementation for Key Value Pair Data Structure?

所以我最近一直在讨论C#,所有的Generic Collections让我有些困惑。 假设我想表示一个数据结构,其中树的头是一个键值对,然后在它下面有一个可选的键值对列表(但没有比这些更多的级别)。 这适合吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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的实际数据类型,就像这样使用

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

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

1
2
3
4
public class TokenTree : Dictionary<string, string>
{
    public IDictionary<string, string> SubPairs;
}

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

并且你明白了构造函数的概念:)


我认为你可能会追求的(作为你的问题的字面实现)是:

1
2
3
4
5
6
7
8
9
public class TokenTree
{
    public TokenTree()
    {
        tree = new Dictionary<string, IDictionary<string,string>>();
    }

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

你确实在问题中说出了键值的"列表",所以你可能想要将内部IDictionary与:

1
IList<KeyValuePair<string, string>>

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

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


只需要添加一件事(虽然我认为你已经让别人回答了你的问题)。为了扩展性(因为我们都知道它会在某些时候发生),您可能需要查看复合模式这是使用"树状结构"的理想选择。

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


@Jay Mooney:.NET中的通用Dictionary类实际上是一个哈希表,只有固定类型。

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

对于哈希表:

1
2
3
4
5
6
7
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);
}

对于字典:

1
2
3
4
5
6
foreach(string key in d.keys)
{
     string valAsString = d[key].ToString();

     System.Diagnostics.Debug.WriteLine(key +"" + valAsString);
}

对于使用KeyValuePair的另一个,只需使用Hashtable的非泛型版本和Dictionary的通用版本。

因此,两种方式都很简单,但Hashtable使用Object来表示键和值,这意味着你将列出所有值类型,并且你没有类型安全,而Dictionary使用泛型类型,因此更好。


使用这样的东西:

1
2
3
class Tree < T > : Dictionary < T, IList< Tree < T > > >  
{  
}

这很难看,但我认为它会给你你想要的东西。太糟糕了KeyValuePair是密封的。


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

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


推荐阅读