sleutel van woordenboek op waarde krijgen

Hoe krijg ik een sleutel van een woordenboek op waarde in C#?

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

Ik wil zoiets als dit:

getByValueKey(string value);

getByValueKey("one") moet "1" teruggeven.

Wat is de beste manier om dit te doen? Misschien HashTable, SortedLists?

Oplossing

Waarden hoeven niet per se uniek te zijn, dus moet je een lookup doen. Je kunt zoiets als dit doen:

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

Als waarden uniek zijn en minder vaak worden ingevoegd dan gelezen, maak dan een inverse dictionary waarin waarden sleutels zijn en sleutels waarden.

Commentaren (13)

Dat zou je kunnen doen:

  1. Door alle KeyValuePair's in het woordenboek door te lopen (wat een aanzienlijke performance hit zal zijn als je een aantal entries in het woordenboek hebt)
    1. Gebruik twee woordenboeken, een voor value-to-key mapping en een voor key-to-value mapping (wat twee keer zoveel ruimte in het geheugen in beslag zou nemen).

Gebruik methode 1 als het niet om prestatie gaat, gebruik methode 2 als het niet om geheugen gaat.

Ook moeten alle sleutels uniek zijn, maar de waarden hoeven niet uniek te zijn. U kunt meer dan één sleutel met de opgegeven waarde hebben.

Is er een reden waarom u de sleutel-waarde relatie niet kunt omkeren?

Commentaren (2)

Ik heb een hele simpele manier om dit te doen. Het werkte perfect voor mij.

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);
}
Commentaren (3)