2009-11-23 12 views

Respuesta

14

Hashtable es de acceso aleatorio y usa internamente System.Collections.DictionaryEntry para sus elementos de .NET 1.1; mientras que un System.Collections.Generic.Dictionary fuertemente tipificado en .NET 2.0 usa System.Collections.Generic.KeyValuePair elementos y también es de acceso aleatorio.

. (Nota: Esta respuesta es parcial hacia el marco .NET 2.0 al proporcionar ejemplos - es por eso que continúa con KeyValuePair en lugar de DictionaryEntry - la pregunta original indica que este es el tipo deseado de trabajar con)

Dado que KeyValuePair es una clase independiente, puede crear manualmente una lista o una matriz de instancias de KeyValuePair, pero se accederá secuencialmente a una lista o matriz. Esto está en contraste con el Hashtable o Dictionary que internamente crea sus propias instancias de elementos y se accede al azar. Ambas son formas válidas de usar instancias de KeyValuePair. También vea see MSDN info about selecting a Collection class to use.

En resumen: el acceso secuencial es más rápido cuando se utiliza un conjunto pequeño de elementos, mientras que un conjunto más grande de elementos se beneficia del acceso aleatorio.

de Microsoft solución híbrida: Una colección especializada interesante introdujo en .NET 1.1 es System.Collections.Specialized.HybridDictionary que utiliza una representación interna ListDictionary (visitada secuencialmente) mientras que la colección es pequeña, y después cambia automáticamente a un representación interna Hashtable (se accede aleatoriamente) cuando la colección se hace grande"

código C# Ejemplo

los siguientes ejemplos muestran las mismas instancias par clave-valor creado para los diferentes escenarios -. de acceso secuencial (dos ejemplos) seguido de un ejemplo de acceso aleatorio. Para simplificar en estos ejemplos, todos usarán una clave int con valor de cadena; puede sustituir en los tipos de datos que necesita usar.

Aquí hay un System.Collections.Generic.List fuertemente tipado de pares clave-valor.
(acceso secuencial)

// --- Make a list of 3 Key-Value pairs (sequentially accessed) --- 
// build it... 
List<KeyValuePair<int, string>> listKVP = new List<KeyValuePair<int, string>>(); 
listKVP.Add(new KeyValuePair<int, string>(1, "one")); 
listKVP.Add(new KeyValuePair<int, string>(2, "two")); 
// access first element - by position... 
Console.Write("key:" + listKVP[0].Key + "value:" + listKVP[0].Value); 

Aquí hay una System.array de pares de clave y valor.
(acceso secuencial)

// --- Make an array of 3 Key-Value pairs (sequentially accessed) --- 
// build it... 
KeyValuePair<int, string>[] arrKVP = new KeyValuePair<int, string>[3]; 
arrKVP[0] = new KeyValuePair<int, string>(1, "one"); 
arrKVP[1] = new KeyValuePair<int, string>(2, "two"); 
// access first element - by position... 
Console.Write("key:" + arrKVP[0].Key + "value:" + arrKVP[0].Value); 

Aquí hay un diccionario de pares de valores clave.
(acceso aleatorio)

// --- Make a Dictionary (strongly typed) of 3 Key-Value pairs (randomly accessed) --- 
// build it ... 
Dictionary<int, string> dict = new Dictionary<int, string>(); 
dict[1] = "one"; 
dict[2] = "two"; 
// access first element - by key... 
Console.Write("key:1 value:" + dict[1]); // returns a string for key 1 
+3

Además, no puede acceder a un elemento de una lista utilizando un valor de clave. Según lo implicado aquí, necesitarías iterar la lista para encontrar la llave que deseas.Mientras que un HashTable le permitiría acceder a sus valores utilizando la clave como índice. – jheddings

+0

Gracias @jheddings, agregué comentarios de código para indicar si se está accediendo al elemento por posición de índice o clave, para aclarar lo que dijo. –

2

Un bit relevante es que Hashtable es una clase .Net 1.1, mientras que KeyValuePair se introdujo en .NET 2.0. (con la introducción de genéricos)

2

Hashtable fue creado cuando C# no apoyó genéricos todavía.

Cuestiones relacionadas