IDictionary <string,string =“”>或NameValueCollection </string,>

时间:2009-03-06 01:34:45

标签: c# generics

我有一个场景,我可以使用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;
}

4 个答案:

答案 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正确地说: