【发布时间】:2010-10-22 15:42:56
【问题描述】:
System.Collections.Specialized.NameObjectCollectionBase 有两个相似的属性:
string[] AllKeys
NameObjectCollectionBase.KeyCollection Keys
它们是否提供不同的数据集?我什么时候想使用其中一个?
【问题讨论】:
标签: .net collections
System.Collections.Specialized.NameObjectCollectionBase 有两个相似的属性:
string[] AllKeys
NameObjectCollectionBase.KeyCollection Keys
它们是否提供不同的数据集?我什么时候想使用其中一个?
【问题讨论】:
标签: .net collections
AllKeys 是 O(n) 操作,而 Keys 是 O(1)。这是因为AllKeys 将密钥复制到一个新数组中,而Keys 只是返回对NameValueCollection 的私钥集合的引用。因此,除了性能上的差异之外,Keys 返回的集合将随着基本集合的变化而变化,因为它只是对原始集合的引用,而AllKeys 将不受变化影响,因为它是一个副本。
这个小测试程序显示了行为的不同:
using System;
using System.Collections.Specialized;
static class Program
{
static void Main()
{
var collection = new NameValueCollection();
var keys = collection.Keys;
var allKeys = collection.AllKeys;
collection.Add("Name", "Value");
Console.WriteLine("Keys: " + keys.Count);
Console.WriteLine("AllKeys: " + allKeys.Length);
Console.ReadLine();
}
}
输出是:
Keys: 1
AllKeys: 0
【讨论】:
new FormUrlEncodedContent(keyValueDict)。然后在对象上调用ReadAsStringAsync().Result 以获取可以分配给 UriBuilder 的 Query 属性的有效查询字符串。
然而,还有一个额外的好处是,您可以在返回 AllKeys() 时使用 foreach 或 LINQ 语句对您的集合进行操作。由于它是一个副本,因此您在修改当前正在枚举的列表时不会出错。
【讨论】: