Pregunta

Necesito almacenar una tabla de búsqueda como miembro de instancia en una de mis clases. La tabla se inicializará cuando se construya el objeto. Cada " fila " tendrá 3 " columnas " ;:

StringKey (e.g., "car")
EnumKey (e.g., LookupKeys.Car)
Value (e.g, "Ths is a car.")

Quiero elegir la estructura de datos que producirá el mejor rendimiento para realizar búsquedas, ya sea por StringKey or EnumKey.

Es un poco incómodo tener 2 teclas para el mismo valor de diccionario. Nunca me he encontrado con esto antes, así que me pregunto cuál es la norma para este tipo de cosas.

Podría hacer una estructura Clave / Valor / Valor en lugar de Clave / Clave / Valor, pero me pregunto qué tipo de impacto en el rendimiento tendría.

¿Estoy pensando en todo esto mal?

¿Fue útil?

Solución

Tienes dos hashmaps.

  • Uno de StringKey a valor.

  • Uno de EnumKey a valor.

No tiene que duplicar todas las instancias de Value, esos objetos se pueden compartir entre los dos hashmaps.

Si hay MUCHOS elementos, es posible que desee usar dos mapas de árbol en lugar de dos hashmaps. Pero el principio esencial ("Compartir los valores") se aplica a ambas estructuras. Un conjunto de valores con dos mapas.

Otros consejos

Bueno ... " Incorrecto " es una forma dura de decirlo. Creo que debido a que el diccionario más común es `` clave única para el valor '', y se requiere mucho esfuerzo para proporcionar estructuras de datos eficientes para eso (mapas), a menudo es mejor usar solo dos de ellos, compartiendo la memoria para los valores si es posible.

¿Es realmente necesario introducir la misma estructura con ambos tipos de clave? Probablemente no necesite reconstruir una estructura de datos compleja usted mismo. Podría hacer algún tipo de encapsulación para la tabla de búsqueda para que realmente tenga dos tablas de búsqueda si la memoria no es un problema. Puede utilizar esta estructura de encapsulación para simular la posibilidad de extraer el valor de "mismo". estructura con cualquier tipo de clave.

O

Si hay alguna forma de mapear entre el valor de enumeración y la clave de cadena, podría seguir esa ruta con solo tener un tipo de tabla de búsqueda.

La interfaz ILookup (TKey, TElement) de LINQ puede ayudar. Asumiendo que su Diccionario es algo así como:

Dictionary<carKey, carValue> cars;

Puedes usar:

ILookUp<carValue, carKey> lookup = cars.ToLookup(x => x.Value, x => x.Key);

(... en realidad creo que podría haber leído un poco mal la pregunta, pero un ILookUp aún podría ajustarse a la factura, pero el conjunto clave / valor podría ser la clave y la enumeración).

Si se garantiza que cada valor sea accesible por ambos tipos de claves, otra idea sería convertir un tipo de clave en otro. Por ejemplo:

public Value getValue(String key)
{
    dictionary.get(key); // normal way
}

public Value getValue(Enum enumKey)
{
    String realKey = toKey(enumKey);
    getValue(realKey); // use String key
}

Puede hacer que su Enum implemente un método toKey () que devuelve su clave String, o tal vez tener otro diccionario que asigne los valores de Enum a sus contrapartes String.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top