2010-06-17 24 views
21

En C# me encuentro utilizando un List<T>, IList<T> o IEnumerable<T> el 99% del tiempo. ¿Hay algún caso en que t sea mejor utilizar un HashTable (o Dictionary<T,T> en 2.0 o superior) sobre estos?Cuándo utilizar un HashTable

edición:

Como se ha señalado, lo que alguien le gustaría ver con la colección a menudo dicta lo que se debe usar, por lo tanto cuándo se usa una Hashtable/Dictonary<T,T> durante un List<T>?

Respuesta

16

Tal vez no directamente relacionada con la pregunta PO, pero hay una entrada en el blog útil sobre la cual estructura de recogida para usar en: SortedSets

Básicamente, lo que quiere hacer con la colección determina qué tipo de colección debe crear .

resumir en más detalle:

  • Uso IList si desea ser capaz de enumerar y/o modificar la colección (normalmente añadiendo al final de la lista)
  • Uso IEnumeration si lo que desea es enumerar la colección (no se necesita añadir/quitar - por lo general se usa como un tipo de retorno)
  • uso IDictionary si desea acceder a los elementos por una llave (añadir/eliminar elementos de forma rápida mediante una clave)
  • uso SortedSet si quieres acceder a un collecti encendido en un orden predefinido (el uso más común es acceder a la colección en orden)

  • En general, use el Diccionario si desea acceder/modificar elementos por clave sin un orden en particular (preferido sobre la lista como generalmente se hace en orden , se usan más que la enumeración que no se puede modificar una enumeración, preferido sobre tabla hash como eso no es estrictamente mecanografiadas, preferido sobre SortedList cuando no necesita llaves ordenados)

+1

Para distinguir más conjuntos de otras colecciones: Un conjunto no permite elementos duplicados dentro de él (y SortedSet etc no va a lanzar una excepción a decir esto, pero .Add() devolverá un valor lógico que le diga). Entonces, si bien es posible que desee una lista ordenada en algunos casos, SortedSet puede no ser la colección ideal para usar. –

6

Sí, cuando necesite poder (rápidamente) buscar elementos por clave.

Por supuesto, usted puede buscar a través de una IList o IEnumerable etc para una llave adecuada, pero que se llevará a O (n) tiempo en lugar de O (1) para Hashtable o Dictionary.

0

En realidad no comparas las mismas cosas, cuando uso un diccionario es porque quiero tener una búsqueda de los datos, generalmente quiero almacenar una lista de objetos y quiero poder buscarlos rápidamente usando una clave de algún tipo.

9

Utiliza una tabla hash (diccionario) cuando desea buscar rápidamente el acceso a un elemento basado en una clave.

Si está utilizando List, IList or IEnumerable en general, esto significa que está pasando por encima de los datos (bueno, en el caso de IEnumerable definitivamente significa eso), y una tabla hash no va a generar nada. Ahora bien, si estuviera buscando un valor en una lista y usándolo para acceder a datos en otra lista, eso sería un poco diferente. Por ejemplo:

  1. Encuentra la posición en la lista de elementos foo.
  2. La posición en la lista para foo corresponde a la posición en otra lista que contiene Foo_Value.
  3. Posición de acceso en segundos para obtener Foo_Value.

Aquí hay un link que describe los diferentes tipos de datos.

Another link.

1

tablas hash son buenas opciones si usted está a menudo haciendo "algo en colección" y no están preocupados por el orden de los elementos de la colección.

Las tablas hash son índices. Puede mantener una tabla hash para indexar una lista, por lo que puede elegir acceder a ella en orden o aleatoriamente según la clave.

0

utilizo tablas hash muy a menudo para enviar tecla de retroceso/colecciones de valores a Javascript a través de métodos de página.

Los diccionarios son buenos para almacenar cosas cuando necesita recuperar un objeto dado su ID pero no quieren tener que acceder a la base de datos: Suponiendo que su colección no es lo suficientemente grande como para inducir un gran número de colisiones y sus datos necesitan recuperar con la suficiente frecuencia para que un IEnumerable sea demasiado lento, los diccionarios pueden dar una aceleración decente.

0

No hay forma de saber exactamente sin saber qué es la colección para, pero a menos que los elementos en su colección sean únicos no puede usar una tabla hash, ya que no habrá nada que usar como clave. Así que tal vez la regla de oro que busca es que si sus miembros son todas diferentes y que quieren tirar de casos individuales por clave, utilice una tabla hash. Si tiene un grupo de artículos que desea tratar de la misma manera (como hacer un foreach en todo el conjunto) use una lista.

0

Hashtable optimiza las búsquedas. Calcula un hash de cada tecla que agregue. A continuación, utiliza este código hash para buscar el elemento muy rápidamente. Es un tipo de Framework .NET más antiguo. Es más lento que el tipo de diccionario genérico.

+0

¿Tiene una referencia para Hashtable siendo más lento? –