NameValueCollection上的属性Keys和AllKeys之间有什么区别?
System.Collections.Specialized.NameObjectCollectionBase有两个相似的属性:
string[] AllKeys NameObjectCollectionBase.KeyCollection Keys
他们提供不同的数据集吗? 我什么时候想用另一个呢?
AllKeys
是O(n)
操作,而Keys
是O(1)
。 这是因为AllKeys
将键值复制到一个新的数组中,而Keys
只是返回对NameValueCollection
的私钥集合的引用。 因此,除了性能上的差异之外, Keys
返回的集合将随基本集合而改变,因为它仅仅是对原始AllKeys
的引用,而AllKeys
将与变更隔离,因为它是副本。
这个小testing程序显示了行为的差异:
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
根据MSDN的文档,当使用AllKeys时,O(n)检索所有的值,而当使用Keys时,它是O(1)。
按键
检索此属性的值是O(1)操作
AllKeys
这个方法是O(n)操作,其中n是Count。
所以基本上,Keys似乎有更好的performance。
然而,还有额外的好处,你将能够使用foreach或返回的AllKeys()的LINQ语句对您的集合进行操作。 由于它是一个副本,所以你将不会遇到错误修改当前列举的列表。