我有一个场景,我可以使用NameValueCollection或IDictionary。但我想知道哪一个会更好地表现。
- 使用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;
}
答案 0 :(得分:29)
这些集合类型不完全可互换:NameValueCollection允许通过整数索引进行访问。如果您不需要该功能,则不应使用NameValueCollection,因为索引不是“免费”。
根据您正在查看的字符串数量,我会考虑使用Hashtable或IDictionary。 Krzysztof Cwalina在这里讨论了细微之处:http://blogs.gotdotnet.com/kcwalina/archive/2004/08/06/210297.aspx。
答案 1 :(得分:9)
IDictionary的另一个优点是,与NameValueCollection不同,它不是特定于实现的。
答案 2 :(得分:4)
我同意fatcat和lomaxx(并且对两个答案都进行了投票)。我想补充一点,在集合类型之间进行选择时,集合类型的性能应该是最后的考虑因素。使用最适合您的使用需求的类型。如果你处于一个性能关键的代码部分(很可能,你不是),那么唯一的答案是衡量每个案例 - 不要相信Interweb,相信数字。
答案 3 :(得分:2)
.NET中的NameValueCollection基本上是QueryStrings用于保存键/值对的内容。最大的区别是添加了两个具有相同键的项目。使用IDictionary,有两种方法可以设置值。当密钥已存在时,使用.Add()方法将在重复键上引发错误。但只是将项目设置为等于值将覆盖该值。这就是IDictionary处理重复键的方式。但NameValueCollection将添加如下值:&#34; value1,value2,value3&#34;。因此现有的项值附加一个逗号,然后每次都附加新的值。
在我看来,这个NameValueCollection是专门为QueryString使用和访问而构建的。一个QueryString,如&#34;?a = 1&amp; b = 2&amp; a = 3&#34;在.NET中将产生项[&#34; a&#34;] =&#34; 1,3&#34;的结果。如何处理重复密钥的这种差异是真实的&#39;差异,就是两者之间的最大差异。
我怀疑当集合很大时,NameValueCollection也不使用任何哈希表来快速访问密钥,因为对于小集合而言,这种访问比没有哈希表的访问慢。我还没有找到明确的信息,说明NameValueCollection是否使用哈希表来访问密钥。我做知道IDictionary使用哈希表,因此访问带有许多键的IDictionary中的键非常快。所以我怀疑对于小型集合,NameValueCollection比IDictionary更快。如果我的猜测是正确的,那么它就意味着NameValueCollection不会被用于大型集合,因为它越大,它就会大幅减速而没有哈希表来访问密钥。
对于查询字符串中的键数,这个数字通常非常小,所以我想猜 NameValueCollection 不使用哈希值,以获得更好的性能。但是,如果微软为性能而设计的东西,以及为用户提供最佳性能的东西,那么Windows就会像现在这样 。因此,我们无法承担任何“伤害”的事情。
此外,我想澄清一个不正确的声明,这是对这个问题最常见的投票答案。 Kateroh在错误答案下面的评论说得很好,我不需要添加任何东西。但我在这里重复Kateroh的评论,所以也许更多的人会意识到最受欢迎的答案是错误的。 Kateroh正确地说: