NameValueCollection上的属性Keys和AllKeys之间有什么区别?

System.Collections.Specialized.NameObjectCollectionBase有两个相似的属性:

string[] AllKeys NameObjectCollectionBase.KeyCollection Keys 

他们提供不同的数据集吗? 我什么时候想用另一个呢?

AllKeysO(n)操作,而KeysO(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语句对您的集合进行操作。 由于它是一个副本,所以你将不会遇到错误修改当前列举的列表。