English 中文(简体)
IDictionary<string, string> 或 NameValueCollection
原标题:
  • 时间:2009-03-06 01:34:44
  •  标签:

我有一个情景,可以使用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;
}
问题回答

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

根据你检查的字符串数量,我会考虑使用Hashtable<string, string>IDictionary<string, string>。Krzysztof Cwalina在这里讨论了微妙的问题:http://blogs.gotdotnet.com/kcwalina/archive/2004/08/06/210297.aspx

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

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

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

在我看来,此NameValueCollection专门用于QueryString的使用和访问。在.NET中,类似于“?a=1&b=2&a=3”的QueryString将产生“item["a"] = "1,3"”的结果。这种处理重复键的方式是真正的差异,也就是两者之间最大的差异。

我怀疑一个NameValueCollection在集合很大时也不使用任何哈希表来快速访问键,因为对于小集合来说,使用哈希表的访问速度比不使用慢。我没有找到明确的信息说明NameValueCollection是否使用哈希表来访问键。我知道IDictionary使用哈希表,因此在具有许多键的IDictionary中访问键非常快。因此,我怀疑NameValueCollection对于小集合比IDictionary更快。如果我的猜测是正确的,那么这意味着一个NameValueCollection绝不能用于大集合,因为它越大,没有哈希表来访问键会大大减慢。

对于查询字符串中的键数,这个数字通常非常小,因此我猜测NameValueCollection并没有使用哈希,以获得更好的性能。但如果微软为了性能和用户最好的利益设计了东西,那么 Windows 就会与今天大不相同。因此,我们不能假设任何应该的事情。

此外,我想澄清这个问题最受欢迎的回答中的错误陈述。Kateroh在错误答案下面的评论很好地说明了这一点,我不需要再加什么。但我重复Kateroh的评论,以便更多的人意识到最受欢迎的答案是错误的。Kateroh正确地说:





相关问题
热门标签