代码之家  ›  专栏  ›  技术社区  ›  Bernard

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

  •  71
  • Bernard  · 技术社区  · 17 年前

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

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

    8 回复  |  直到 8 年前
        1
  •  134
  •   Francis P    12 年前

    有一个名为keyValuePair的实际数据类型,使用如下

    KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");
    
        2
  •  12
  •   Jon Limjap    17 年前

    您可以做的一件事是直接从框中使用dictionary对象,然后通过自己的修改对其进行扩展:

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

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

    是的,你有建造师的概念,对吧:)

        3
  •  7
  •   Patrick Ali sasoli    8 年前

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

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

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

    IList<KeyValuePair<string, string>>
    
        4
  •  5
  •   Coincoin    17 年前

    有一个keyValuePair内置类型。事实上,当您在IDictionary中迭代时,这就是它给您的访问权限。

    而且,这个结构很难是一棵树,找到一个更具代表性的名称可能是一个很好的练习。

        5
  •  3
  •   Rob Cooper    17 年前

    还有一件事要补充(尽管我认为你的问题已经被其他人回答了)。为了扩展性的利益(因为我们都知道它会在某个时刻发生),您可能需要检查 Composite Pattern 这对于使用“类树结构”非常理想。

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

        6
  •  2
  •   Community Mohan Dere    9 年前

    @ Jay Mooney :NET中的通用字典类实际上是哈希表,只是具有固定类型。

    您所显示的代码不应该说服任何人使用哈希表而不是字典,因为这两个代码片段都可以用于这两种类型。

    对于哈希表:

    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使用对象作为键和值,这意味着您将对所有值类型进行装箱,并且您没有类型安全性,字典使用泛型类型,因此更好。

        7
  •  1
  •   Lasse V. Karlsen    17 年前

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

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

        8
  •  1
  •   kokos    17 年前

    使用类似的方法:

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

    它很难看,但我想它会给你想要的。密封的keyValuePair太差。