Domanda

Devo memorizzare una tabella di ricerca come membro di istanza in una delle mie classi. La tabella verrà inizializzata quando viene costruito l'oggetto. Ogni "riga" avrà 3 "colonne":

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

Voglio scegliere la struttura di dati che produrrà le migliori prestazioni per fare ricerche sia da StringKey o EnumKey.

È un po 'imbarazzante avere 2 chiavi per lo stesso valore del dizionario. Non l'ho mai visto prima, quindi mi chiedo quale sia la norma per questo tipo di cose.

Potrei creare una struttura Chiave / Valore / Valore anziché Chiave / Chiave / Valore, ma mi chiedo quale tipo di impatto sulle prestazioni avrebbe.

Sto pensando a questo tutto sbagliato?

È stato utile?

Soluzione

Hai due hashmap.

  • Uno da StringKey al valore.

  • Uno da EnumKey al valore.

Non è necessario duplicare tutte le istanze Value, tali oggetti possono essere condivisi tra le due hashmap.

Se sono MOLTI elementi, potresti voler usare due mappe ad albero invece di due hashap. Ma il principio essenziale ("Condividi i valori") si applica a entrambe le strutture. Un set di valori con due mappe.

Altri suggerimenti

Bene ... " Sbagliato " è un modo duro di dirlo. Penso che poiché il dizionario più comune è "single key to value", e ci si impegna molto per fornire strutture dati efficienti per questo (mappe), spesso è meglio usare solo due di questi, condividendo la memoria per i valori se possibile,

È davvero necessario entrare nella stessa struttura con entrambi i tipi di chiave? Probabilmente non è necessario ricostruire una struttura di dati complessa da soli. Potresti fare una sorta di incapsulamento per la tabella di ricerca in modo da avere davvero due tabelle di ricerca se la memoria non è un problema. Puoi utilizzare questa struttura incapsulante per simulare la possibilità di estrarre il valore dallo "stesso" struttura con entrambi i tipi di chiave.

o

Se esiste un modo per eseguire il mapping tra il valore enum e la chiave stringa, è possibile seguire tale percorso con un solo tipo di tabella di ricerca.

L'interfaccia ILookup (TKey, TElement) di LINQ può essere d'aiuto. Supponendo che il tuo dizionario sia simile a:

Dictionary<carKey, carValue> cars;

Puoi usare:

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

(... in realtà penso che potrei aver letto male la domanda, ma un ILookUp potrebbe ancora adattarsi al conto, ma potrebbe essere necessario che la chiave / valore impostato sia la chiave e l'enum.)

Se si garantisce che ogni valore è accessibile da entrambi i tipi di chiavi, un'altra idea sarebbe quella di convertire un tipo di chiave in un altro. Ad esempio:

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

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

Potresti avere il tuo Enum implementare un metodo toKey () che restituisce la loro chiave String, o forse avere un altro dizionario che associa i valori di Enum alle controparti String.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top