键值对数据结构的最佳实现?
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) 对。 KeyValuePairusing NameValuePair = System.Collections.Generic.KeyValuePair<string, string>;
在每个需要(string, string)
结构的文件的顶部附近。虽然我发现在我的命名空间中创建class NameValuePair
更方便:public class NameValuePair KeyValuePair<string, string> it; public NameValuePair( string name, string value ) it = new KeyValuePair<string, string>( 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会产生覆盖。