Wörterbuchschlüssel nach Wert holen

Wie erhalte ich einen Dictionary-Schlüssel nach Wert in C#?

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

Ich möchte etwas wie dieses:

getByValueKey(string value);

getByValueKey("one") muss "1" zurückgeben.

Was ist der beste Weg, dies zu tun? Vielleicht HashTable, SortedLists?

Lösung

Die Werte müssen nicht unbedingt eindeutig sein, so dass Sie einen Lookup durchführen müssen. Sie können etwas wie dies tun:

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

Wenn die Werte eindeutig sind und seltener eingefügt als gelesen werden, erstellen Sie ein inverses Wörterbuch, in dem Werte die Schlüssel und Schlüssel die Werte sind.

Kommentare (13)

Das könnten Sie tun:

  1. Indem Sie eine Schleife durch alle KeyValuePair's im Wörterbuch ziehen (was bei einer großen Anzahl von Einträgen im Wörterbuch einen erheblichen Leistungseinbruch bedeutet)
  2. Verwendung von zwei Wörterbüchern, eines für die Wert-zu-Schlüssel-Zuordnung und eines für die Schlüssel-zu-Wert-Zuordnung (was doppelt so viel Platz im Speicher beanspruchen würde).

Verwenden Sie Methode 1, wenn die Leistung keine Rolle spielt, verwenden Sie Methode 2, wenn der Speicherplatz keine Rolle spielt.

Außerdem müssen alle Schlüssel eindeutig sein, aber die Werte müssen nicht eindeutig sein. Sie können mehr als einen Schlüssel mit dem angegebenen Wert haben.

Gibt es einen Grund, warum Sie die Schlüssel-Wert-Beziehung nicht umkehren können?

Kommentare (2)

Ich habe eine sehr einfache Möglichkeit, dies zu tun. Es funktionierte perfekt für mich.

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