2009-04-29 9 views

Respuesta

55

AllKeys es una operación O(n), mientras que Keys es O(1). Esto se debe a que AllKeys copia las claves en una nueva matriz, mientras que Keys simplemente devuelve una referencia a la colección de claves privadas de NameValueCollection. Por lo tanto, más allá de la diferencia de rendimiento, la colección devuelta por Keys cambiará con la colección base, ya que es solo una referencia al original, mientras que AllKeys estará aislada de los cambios porque es una copia.

Este pequeño programa de prueba muestra la diferencia de comportamiento:

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(); 
    } 
} 

La salida es:

Keys: 1 
AllKeys: 0 
+4

Eso es lo que estoy pensando también. Seguramente pensarías que una gran diferencia como esa sería explícita en la documentación. (O tal vez nombrado un poco mejor para reflejar la semántica). Por lo general, la documentación de MSDN es bastante excelente sobre cosas así. Es por eso que este me tiró con la guardia baja. – MojoFilter

+2

+1 buena prueba para probar el punto. – BFree

+1

De acuerdo, mala reputación y semántica confusa. Sin mencionar que FxCop no le gusta a las propiedades que devuelven matrices por esta misma razón. Como esta clase es un remanente de los días previos a los genéricos, tal vez el diccionario o el sería mejor ahora? –

6

De acuerdo con la documentación de MSDN, cuando se utiliza AllKeys, es O (n) para recuperar toda la valores, mientras que al usar Keys es O (1).

Keys

Recuperando el valor de esta propiedad es una operación

AllKeys

O (1) Este método es un O (n) la operación, donde n es el conde

Básicamente, parece que Keys tiene un mejor rendimiento.

5

Sin embargo, existe la ventaja añadida de que podría realizar operaciones en su colección mediante una instrucción foreach o LINQ al devolver AllKeys(). Como es una copia, no obtendrá errores al modificar una lista que se está enumerando actualmente.

Cuestiones relacionadas