C# IDictionary<;字符串,字符串>;或NameValueCollection

C# IDictionary<;字符串,字符串>;或NameValueCollection,c#,generics,C#,Generics,我有一个场景,在这个场景中,我可以使用NameValueCollection或IDictionary。但我想知道哪一个性能更好 --使用NameValueCollection NameValueCollection options() { NameValueCollection nc = new NameValueCollection(); nc = ....; //populate nc here if(sorting) //sort NameValu

我有一个场景,在这个场景中,我可以使用NameValueCollection或IDictionary。但我想知道哪一个性能更好

--使用NameValueCollection

NameValueCollection options()
{
    NameValueCollection nc = new NameValueCollection();

    nc = ....; //populate nc here

    if(sorting)
       //sort NameValueCollection nc here

    return nc;
}
--使用字典

IDictionary<string, string> options()
{
    Dictionary<string, string> optionDictionary = new Dictionary<string, string>();

    optionDictionary = ....; //populate

    if(sorting)
       return new SortedDictionary<string, string>(optionDictionary);
    else
       return optionDictionary;
}
IDictionary选项()
{
Dictionary optionDictionary=新字典();
optionDictionary=..;//填充
如果(排序)
返回新的分类词典(optionDictionary);
其他的
返回选项字典;
}

这些集合类型不能完全互换:
NameValueCollection
允许通过整数索引进行访问。如果您不需要该功能,就不应该使用
NameValueCollection
,因为索引不是免费的


根据您所看到的字符串的数量,我将考虑<代码>哈希表< /> >或<代码> IDICORIGIO/COD>。Krzysztof Cwalina在这里讨论了其中的微妙之处:

IDictionary的另一个优点是它不像NameValueCollection那样是特定于实现的。

我同意fatcat和lomaxx(两个答案都投了赞成票)。我想补充一点,在选择集合类型时,集合类型的性能很可能是最后一个考虑因素。使用最适合您使用需要的类型。如果您处于代码的性能关键部分(很可能不是),那么唯一的答案就是衡量每种情况-不要相信互联网,相信数字。

基本上,.NET中的NameValueCollection用于查询字符串来保存键/值对。最大的区别是添加了两个具有相同键的项。使用IDictionary,有两种方法设置值。使用.Add()方法将在重复键已存在时对该键抛出错误。但只要将该项设置为一个值,就会覆盖该值。这就是IDictionary处理重复键的方式。但是NameValueCollection会添加如下值:“value1、value2、value3”。因此,现有项值会附加一个逗号,然后每次都会附加新值

在我看来,这个NameValueCollection是专门为QueryString的使用和访问而构建的。NET中类似“?A=1&b=2&A=3”的查询字符串将生成项[“A”]=“1,3”的结果。处理重复键的方式的这种差异是“真正的”差异,即两者之间最大的差异

我怀疑当集合较大时,NameValueCollection也不使用任何哈希表来快速访问密钥,因为对于较小的集合,这种访问速度比没有哈希表时慢。我还没有找到明确的信息来说明NameValueCollection是否使用哈希表来访问键。我知道IDictionary使用哈希表,因此访问具有多个键的IDictionary中的键非常快。因此,我怀疑对于小型集合,NameValueCollection比IDictionary更快。如果我的猜测是正确的,那么它就意味着NameValueCollection决不能用于大型集合,因为它越大,在没有哈希表访问键的情况下,它的速度就越慢

对于查询字符串中的键数,这个数字通常非常小,因此我想NameValueCollection不使用哈希,以获得更好的性能。但是,如果微软设计的东西是为了性能,为了用户的利益,那么Windows将与今天大不相同。所以我们不能假设任何“应该”的东西

此外,我想澄清一个不正确的说法,即对这个问题的最普遍投票答案。卡特罗在错误答案下面的评论很好地说明了这一点,我不需要添加任何内容。但我在这里重复卡特罗的评论,这样也许更多的人会意识到最流行的答案是错误的。卡特罗正确地指出:

  • 根据这篇关于NameValueCollection的msdn文章:“这种类型的集合不保留元素的顺序,并且在枚举集合时不保证特定的顺序。”–kateroh Mar 4'11年3月4日18:38

NameValueCollection还支持每个键有多个值(查询字符串等所需)。不正确。根据这篇关于namevaluecollection的msdn文章:“这种类型的集合不保留元素的顺序,并且在枚举集合时不保证特定的顺序。”+1表示Interweb警告。这是杰克·布莱克作为亚里士多德主义者的一种方式,并提倡使用三重元素。真的吗?性能不是存在不同集合类型的唯一原因吗?否则,我们只会对所有内容使用列表。“具体实现”是什么意思?
NameValueCollection
是一种具体类型<代码>IDictionary是一个接口。因此,有了接口,您就有了更多的灵活性,因为您可以使用实现该接口的任何具体类。