2009-04-29 119 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()的返回進行操作。由於它是一個副本,因此您將不會在修改當前列舉的列表時遇到錯誤。

相關問題