uso c# collections

c# - uso - dictionary string object



Diferencia entre Dictionary y Hashtable (7)

Posible duplicado:
¿Por qué se prefiere Dictionary sobre hashtable en C #?

Cuál es la diferencia entre Dictionary y Hashtable. ¿Cómo decidir cuál usar?


El diccionario está tipeado (por lo que los tipos de valores no necesitan boxeo), un Hashtable no (por lo tanto, los tipos de valores necesitan boxeo). Hashtable tiene una forma más agradable de obtener un valor que el diccionario en mi humilde opinión, porque siempre sabe que el valor es un objeto. Aunque si usa .NET 3.5, es fácil escribir un método de extensión para que el diccionario obtenga un comportamiento similar.

Si necesita valores múltiples por clave, consulte mi código fuente de MultiValueDictionary aquí: multimap en .NET


Hay una diferencia más importante entre una HashTable y un Dictionary. Si utiliza indexadores para obtener un valor de una HashTable, la HashTable devolverá nulo con éxito para un elemento inexistente, mientras que el diccionario arrojará un error si intenta acceder a un elemento utilizando un indexador que no existe en el Diccionario


ILookup Interface se usa en .net 3.5 con linq.

El HashTable es la clase base que es de tipo débil; la clase abstracta DictionaryBase está fuertemente tipada y utiliza internamente una HashTable.

Encontré una cosa extraña sobre Dictionary, cuando agregamos las múltiples entradas en Dictionary, se mantiene el orden en que se agregan las entradas. Por lo tanto, si aplico un foreach en el Diccionario, obtendré los registros en el mismo orden en que los inserté.

Sin embargo, esto no es cierto con HashTable normal, ya que cuando agrego los mismos registros en Hashtable, la orden no se mantiene. Según mi conocimiento, Dictionary se basa en Hashtable, si esto es cierto, ¿por qué mi Dictionary mantiene el orden pero HashTable no?

En cuanto a por qué se comportan de manera diferente, es porque Generic Dictionary implementa una tabla hash, pero no se basa en System.Collections.Hashtable. La implementación del Diccionario genérico se basa en la asignación de pares clave-valor de una lista. Luego se indexan con los contenedores de hashtables para el acceso aleatorio, pero cuando devuelve un enumerador, simplemente recorre la lista en orden secuencial, que será el orden de inserción, siempre que las entradas no se reutilicen.

shiv govind Birlasoft. :)


La clase Hashtable es un tipo específico de clase de diccionario que utiliza un valor entero (llamado hash) para ayudar en el almacenamiento de sus claves. La clase Hashtable usa el hash para acelerar la búsqueda de una clave específica en la colección. Cada objeto en .NET deriva de la clase Object. Esta clase admite el método GetHash, que devuelve un número entero que identifica de manera única el objeto. La clase Hashtable es una colección muy eficiente en general. El único problema con la clase Hashtable es que requiere un poco de sobrecarga, y para colecciones pequeñas (menos de diez elementos) la sobrecarga puede impedir el rendimiento.

Hay alguna diferencia especial entre dos que debe tenerse en cuenta:

HashTable: es una colección no genérica, la mayor sobrecarga de esta colección es que hace boxeo automáticamente para sus valores y para obtener su valor original necesita realizar unboxing, estos para disminuir el rendimiento de la aplicación como penalización.

Diccionario: este es un tipo genérico de colección en el que no hay boxeo implícito, por lo que no es necesario empacarlo, siempre obtendrá los valores originales que tenía almacenados para que mejore el rendimiento de la aplicación.

la segunda diferencia considerable es:

si estaba tratando de acceder a un valor desde la tabla hash sobre la base de la clave que no existe, devolverá nulo. Pero en el caso del diccionario le dará KeyNotFoundException.


Simplemente, Dictionary<TKey,TValue> es un tipo genérico que permite:

  • tipado estático (y verificación en tiempo de compilación)
  • usar sin boxeo

Si es .NET 2.0 o superior, debería preferir Dictionary<TKey,TValue> (y las otras colecciones genéricas)

Una diferencia sutil pero importante es que Hashtable admite múltiples hilos de lectura con un solo hilo de escritura, mientras que Dictionary no ofrece seguridad de hilos. Si necesita seguridad de subprocesos con un diccionario genérico, debe implementar su propia sincronización o (en .NET 4.0) usar ConcurrentDictionary<TKey, TValue> .


Vamos a dar un ejemplo que explique la diferencia entre hashtable y diccionario.

Aquí hay un método que implementa hashtable

public void MethodHashTable() { Hashtable objHashTable = new Hashtable(); objHashTable.Add(1, 100); // int objHashTable.Add(2.99, 200); // float objHashTable.Add(''A'', 300); // char objHashTable.Add("4", 400); // string lblDisplay1.Text = objHashTable[1].ToString(); lblDisplay2.Text = objHashTable[2.99].ToString(); lblDisplay3.Text = objHashTable[''A''].ToString(); lblDisplay4.Text = objHashTable["4"].ToString(); // ----------- Not Possible for HashTable ---------- //foreach (KeyValuePair<string, int> pair in objHashTable) //{ // lblDisplay.Text = pair.Value + " " + lblDisplay.Text; //} }

Lo siguiente es para el diccionario

public void MethodDictionary() { Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictionary.Add("cat", 2); dictionary.Add("dog", 1); dictionary.Add("llama", 0); dictionary.Add("iguana", -1); //dictionary.Add(1, -2); // Compilation Error foreach (KeyValuePair<string, int> pair in dictionary) { lblDisplay.Text = pair.Value + " " + lblDisplay.Text; } }


Quieres agregar una diferencia:

Intentar acceder a una clave inexistente proporciona un error de tiempo de ejecución en el Diccionario, pero no hay ningún problema en la tabla hash ya que devuelve un valor nulo en lugar de un error.

p.ej

//No strict type declaration Hashtable hash = new Hashtable(); hash.Add(1, "One"); hash.Add(2, "Two"); hash.Add(3, "Three"); hash.Add(4, "Four"); hash.Add(5, "Five"); hash.Add(6, "Six"); hash.Add(7, "Seven"); hash.Add(8, "Eight"); hash.Add(9, "Nine"); hash.Add("Ten", 10);// No error as no strict type for(int i=0;i<=hash.Count;i++)//=>No error for index 0 { //Can be accessed through indexers Console.WriteLine(hash[i]); } Console.WriteLine(hash["Ten"]);//=> No error in Has Table

aquí no hay error para la tecla 0 y también para la tecla "diez" (nota: t es pequeño)

//Strict type declaration Dictionary<int,string> dictionary= new Dictionary<int, string>(); dictionary.Add(1, "One"); dictionary.Add(2, "Two"); dictionary.Add(3, "Three"); dictionary.Add(4, "Four"); dictionary.Add(5, "Five"); dictionary.Add(6, "Six"); dictionary.Add(7, "Seven"); dictionary.Add(8, "Eight"); dictionary.Add(9, "Nine"); //dictionary.Add("Ten", 10);// error as only key, value pair of type int, string can be added //for i=0, key doesn''t exist error for (int i = 1; i <= dictionary.Count; i++) { //Can be accessed through indexers Console.WriteLine(dictionary[i]); } //Error : The given key was not present in the dictionary. //Console.WriteLine(dictionary[10]);

aquí error para la clave 0 y también para la clave 10 ya que ambos son inexistentes en el diccionario, error de tiempo de ejecución, mientras intentan acceder.