还有其他一些问题,比如KeyValuePair和IDictionary,但我觉得这个问题略有不同。
NameValueCollection
接受字符串键和字符串值。
KeyValuePair
就像一本字典,你告诉它键和值是什么类型。
我不明白为什么NameValueCollection
存在。使用字符串类型初始化KeyValuePair
似乎就足够了。我还注意到NameValueCollection
有更多可用的方法,但为什么不将两个类合并为一个呢?
答案 0 :(得分:13)
KeyValuePair
不像字典。它只是一个包含Key和Value的元组。
NameValueCollection
是相当于 IList<KeyValuePair<string,IList<string>>>
的包装(注意NameValueCollection
早于泛型) - Get(string)
之类的操作是{{1}可以通过索引获取和项目,每个键映射到一个或更多值(这与O(n)
不同)。
the NameValueCollection documentation:
解释了这个问题的原因此类可用于标题,查询字符串和表单数据。
Dictionary<string,string>
的某些类似行为的较新“替换”数据结构为Lookup<string,string>
。 (但是,它并不直接支持与花费注释一样不可变的操作。)
快乐的编码。
答案 1 :(得分:3)
NameValueCollection,KeyValuePair是泛型类型,直到2.0才添加到.NET。 System.Collections.Specialized中的所有类都早于添加泛型;它包含某些强类型(如果你愿意的话),当你需要用户不需要从对象转换为字符串时使用它。
答案 2 :(得分:0)
KeyValuePair是您用来迭代Dictionary
的组件var dictionary = new Dictionary<int,long>
foreach(var kvp in dictionary)
{
// kvp is KeyValuePair<int,long>. kvp.Key is the int key and kvp.Value is the long value for the key
}
NameValueCollection是可转位的。