2009-03-06 80 views
29

我有一个场景,我可以使用NameValueCollection或IDictionary。但我想知道哪一个更好的表现。IDictionary <string,string>或NameValueCollection

- 使用的NameValueCollection

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

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

    if(sorting) 
     //sort NameValueCollection nc here 

    return nc; 
} 

- 使用IDictionary的

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; 
} 

回答

28

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

根据你正在查看的字符串的数量,我会考虑哈希表或IDictionary。 Krzysztof Cwalina讨论了这里的微妙之处:http://blogs.gotdotnet.com/kcwalina/archive/2004/08/06/210297.aspx

+11

NameValueCollection还支持每个键的多个值(查询字符串等所需)。 – 2009-03-06 04:37:00

+15

不正确。根据这个有关namevaluecollection的msdn文章:http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx “这种类型的集合不保留元素的排序,并且不枚举集合时特定的顺序是有保证的。“ – kateroh 2011-03-04 18:38:42

9

IDictionary的另一个优点是,它不是与NameValueCollection不同的实现。

+0

'implimentation specific'是什么意思? – 2016-01-22 14:53:15

4

我同意fatcat和lomaxx(并且对两个答案都投了赞成票)。我想补充说,集合类型的性能应该很可能是在集合类型之间进行选择时的最后一个考虑因素。使用最适合您的使用需求的类型。如果您处于代码性能关键部分(而且很可能不是),那么唯一的答案就是衡量每个案例 - 不要相信Interweb,相信这些数字。

2

.NET中的NameValueCollection基本上是用于QueryStrings来保存键/值对的。最大的不同之处在于添加了具有相同密钥的两个项目。使用IDictionary,有两种方法来设置值。当密钥已经存在时,使用.Add()方法将在重复密钥上引发错误。但是简单地将项目设置为一个值将覆盖该值。这是IDictionary处理重复键的方式。但是,NameValueCollection会添加如下值:“value1,value2,value3”。因此,现有的项目值会附加逗号,然后每次都附加新的值。

在我看来,这个NameValueCollection是专门为QueryString的使用和访问而构建的。像.NET中的“?a = 1 & b = 2 & a = 3”的QueryString将产生item [“a”] =“1,3”的结果。如何处理重复键的这种差异是“真正的”差异,也就是两者之间的最大区别。

I suspect当集合很大时,NameValueCollection也不使用任何散列表来快速访问键,因为对于小集合,这种访问比没有散列表的访问速度慢。我还没有发现确定NameValueCollection是否使用散列表访问密钥的明确信息。我知道一个IDictionary使用一个哈希表,这样访问具有多个键的IDictionary中的键是相当快的。所以我嫌疑人一个NameValueCollection是一个比IDictionary更快的小集合。如果我的猜测是正确的,那么它意味着一个NameValueCollection shud决不会被用于大型集合,因为它的大小越大,它就会大量减慢而没有散列表访问密钥。

对于查询字符串键的数量,这个数字通常是非常小的,所以我WUD NameValueCollection中不使用哈希值,获得更好的性能。但是,如果微软设计了性能和用户最好的东西,那么Windows就是,所以与现在不同。所以我们不能假设任何'不可阻挡'。

此外,我想澄清一个不正确的说法,由这个问题最普遍的投票答案。卡特洛在不正确的答案下面的评论说它很好,我不需要添加任何东西。但是我在这里重复Kateroh的评论,所以也许更多的人会意识到最受欢迎的答案是错误。 Kateroh正确地指出:

相关问题