ottenere la chiave del dizionario per valore

Come ottengo la chiave di un dizionario per valore in C#?

Dictionary<string, string> types = new Dictionary<string, string>()
{
            {"1", "one"},
            {"2", "two"},
            {"3", "three"}
};

Voglio qualcosa come questo:

getByValueKey(string value);

getByValueKey("one") deve restituire "1".

Qual è il modo migliore per farlo? Forse HashTable, SortedLists?

Soluzione

I valori non devono necessariamente essere unici, quindi dovete fare una ricerca. Potete fare qualcosa del genere:

var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

Se i valori sono unici e vengono inseriti meno frequentemente che letti, allora create un dizionario inverso dove i valori sono le chiavi e le chiavi sono i valori.

Commentari (13)

Potresti farlo:

  1. Eseguendo un ciclo attraverso tutte le KeyValuePair's nel dizionario (che sarà un notevole calo di prestazioni se avete un certo numero di voci nel dizionario)
  2. Usare due dizionari, uno per la mappatura valore-chiave e uno per la mappatura chiave-valore (che occuperebbe il doppio dello spazio in memoria).

Usate il metodo 1 se le prestazioni non sono una considerazione, usate il metodo 2 se la memoria non è una considerazione.

Inoltre, tutte le chiavi devono essere uniche, ma i valori non devono essere unici. Potete avere più di una chiave con il valore specificato.

C'è qualche motivo per cui non si può invertire la relazione chiave-valore?

Commentari (2)

Ho un modo molto semplice per farlo. Ha funzionato perfettamente per me.

Dictionary types = new Dictionary();

types.Add("1", "one");
types.Add("2", "two");
types.Add("3", "three");

Console.WriteLine("Please type a key to show its value: ");
string rLine = Console.ReadLine();

if(types.ContainsKey(rLine))
{
    string value_For_Key = types[rLine];
    Console.WriteLine("Value for " + rLine + " is" + value_For_Key);
}
Commentari (3)