Quiero almacenar mi colección personalizada como una clave y el valor también es una colección de lista de cadenas.Puedo lograr esto utilizando tanto KeyvaluePair como hashtable.¿Cuál es la mejor colisión adecuada que me da más ventaja en términos de flexibilidad?¿Cuál es la diferencia entre KeyValuePair y Hashtable en .NET?
Respuesta
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
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)
Hashtable fue creado cuando C# no apoyó genéricos todavía.
- 1. ¿Cuál es la diferencia entre Hashtable y Dictionary?
- 2. Cuál es la diferencia principal entre Dictionary y Hashtable
- 3. ¿Cuál es la diferencia entre una Hashtable y Properties?
- 4. Diferencia entre diccionario y Hashtable
- 5. En .NET, ¿cuál es la diferencia entre AsFoo() y ToFoo()?
- 6. ¿Cuál es la diferencia entre X509Certificate2 y X509Certificate en .NET?
- 7. ¿Cuál es la diferencia entre finalizar y eliminar en .net?
- 8. ¿Cuál es la diferencia entre C# y .NET?
- 9. ¿Cuál es la diferencia entre C#, .NET y CLI?
- 10. Diferencias entre .Net Hashtable, Java Hashtable y HashMap
- 11. Diferencia entre Hashtable y Collections.synchronizedMap (HashMap)
- 12. ¿Cuáles son las diferencias b/w Hashtable, Dictionary y KeyValuePair?
- 13. ¿Cuál es la diferencia entre + = y = +?
- 14. ¿cuál es la diferencia entre:.! y: r !?
- 15. ¿Cuál es la diferencia entre ".equals" y "=="?
- 16. Cuál es la diferencia entre $ y jQuery
- 17. Cuál es la diferencia entre = y: =
- 18. Cuál es la diferencia entre $ (...) y `...`
- 19. ¿Cuál es la diferencia entre dict() y {}?
- 20. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 21. ¿Cuál es la diferencia entre {0} y ""?
- 22. ¿Cuál es la diferencia entre .ToString (+) y ""
- 23. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 24. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 25. ¿Cuál es la diferencia entre " " y ""?
- 26. ¿Cuál es la diferencia entre $ get y $ find en JavaScript?
- 27. ¿Cuál es la diferencia entre Microsoft.NET \ Framework y Microsoft.NET \ Framework64?
- 28. ¿Cuál es la diferencia entre interfaz y @interface en java?
- 29. ¿Cuál es la diferencia entre ASP.NET y C#?
- 30. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
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
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. –