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

Posted

技术标签:

【中文标题】键值对数据结构的最佳实现?【英文标题】: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;

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

【问题讨论】:

【参考方案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 被密封了。

【讨论】:

以上是关于键值对数据结构的最佳实现?的主要内容,如果未能解决你的问题,请参考以下文章

将 json 格式的键值对转换为以符号为键的 ruby​​ 哈希的最佳方法是啥?

java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。

从字典中提取键值对的子集?

是否有最佳实践/连贯的方法来更新包含哈希键值存储的数据库字段?

java如何对一堆键值对数据分组

Redis最佳实践