我有一个场景,在这个场景中,我可以使用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;
}发布于 2016-01-23 00:17:34
.NET中的NameValueCollection基本上就是QueryStrings用来保存键/值对的东西。最大的区别是添加了两个具有相同键的项。对于IDictionary,有两种方法可以设置值。当键已经存在时,使用.Add()方法将在重复键上抛出错误。但是,简单地将该项设置为等于某个值将覆盖该值。这就是IDictionary处理重复键的方式。但是NameValueCollection会添加这样的值:"value1,value2,value3“。因此,现有的项值被附加一个逗号,然后每次都附加新的值。
在我看来,这个NameValueCollection是专门为QueryString的使用和访问而构建的。像.NET中的"?a=1&b=2&a=3“这样的QueryString将产生项目”a“= "1,3”的结果。这种如何处理重复键的差异是“真正的”差异,也就是两者之间的最大差异。
我怀疑当集合很大时,NameValueCollection也不使用任何哈希表来快速访问关键字,因为这种访问对于较小的集合比没有哈希表要慢。我还没有找到明确的信息来说明NameValueCollection是否使用哈希表来访问密钥。我知道IDictionary使用哈希表,因此访问包含多个键的IDictionary中的键是相当快的。因此,我怀疑对于小集合,NameValueCollection比IDictionary更快。如果我的猜测是正确的,那么这意味着NameValueCollection shud绝不会用于大型集合,因为它越大,如果没有哈希表来访问键,它就会大量减慢。
对于查询字符串中的键的数量,这个数字通常非常小,所以我猜NameValueCollection不使用哈希,以获得更好的性能。但是,如果微软设计的东西是为了性能,为了他们的用户最好,Windows将会与今天如此不同。所以我们不能假设任何“应该是”的东西。
另外,我想通过这个问题最受欢迎的答案来澄清一个不正确的说法。卡特罗在错误答案下面的评论很好地说明了这一点,我不需要添加任何东西。但我在这里重复卡特罗的评论,这样也许更多的人会意识到最流行的答案是错误的。卡特罗正确地陈述了:
https://stackoverflow.com/questions/617443
复制相似问题