【问题标题】:Best implementation for Key Value Pair Data Structure?键值对数据结构的最佳实现?
【发布时间】:2010-09-05 17:54:48
【问题描述】:

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

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

【问题讨论】:

    标签: c# data-structures collections


    【解决方案1】:

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

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

    【讨论】:

    • 这很适用于“使用”语句(类似于旧的 typedef),以便节省一些输入并使一切更清晰。如果你经常使用 e。 G。 (string, string) 对。
    • KeyValuePair NAME_HERE = new KeyValuePair("defaultkey", "defaultvalue");
    • 扩展@AndreasReiff 的评论:using NameValuePair = System.Collections.Generic.KeyValuePair&lt;string, string&gt;; 在每个需要(string, string) 结构的文件的顶部附近。虽然我发现在我的命名空间中创建class NameValuePair 更方便:public class NameValuePair { KeyValuePair&lt;string, string&gt; it; public NameValuePair( string name, string value ) { it = new KeyValuePair&lt;string, string&gt;( name, value ); } public string Name { get { return it.Key; } } public string Value { get { return it.Value; } } }
    【解决方案2】:

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

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

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

    是的,你理解了构造函数的概念:)

    【讨论】:

      【解决方案3】:

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

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

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

      IList<KeyValuePair<string, string>>
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                【解决方案8】:

                使用这样的东西:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-04-18
                  • 2013-01-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-09-21
                  • 2020-08-01
                  • 2014-03-21
                  相关资源
                  最近更新 更多