2009-04-29 81 views

回答

55

AllKeysO(n)操作,而KeysO(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 
+4

这就是我的想法。你一定会认为这样的重大差异将在文档中明确。 (或者可能命名更好,以反映语义)。通常,MSDN文档对于类似的东西非常优秀。这就是为什么这一个让我无法防备的原因。 – MojoFilter 2009-04-29 18:00:32

6

根据MSDN的文档,使用AllKeys时,它的O(n)的检索所有值,而使用键时,它是O(1)。

Keys

检索该属性 的值是O(1)操作

AllKeys

此方法是一个为O​​(n),其中n是伯爵。

所以基本上,Keys似乎有更好的表现。

5

然而,还有额外的好处,你可以使用foreach或LINQ语句对AllKeys()的返回进行操作。由于它是一个副本,因此您将不会在修改当前列举的列表时遇到错误。

相关问题