Allerdings hab ich diese Methode selbst geschrieben da ich sie im Framework vermisste:
public static class gfoidlDictionaryExtensions { public static TKey GetKeyByValue<TKey, TValue>( this Dictionary<TKey, TValue> dic, TValue value) { var query = from kvp in dic where object.Equals(kvp.Value, value) select kvp.Key;
O(1) nur wenn auf einen Wert über den Schlüssel zugegriffen wird. Für die Wahl des Schlüssels anhand des Wertes gibt es keine "Indizierung" und daher ist es O(n).
Ist eine elgante Lösung. Ich würd auch dies in eine Erweiterung packen damit es wiederverwendbar ist. Und wegen Speichereffizienz das ToList duch eine Enumeration ersetzen und somit wäre ich wieder bei meiner Lösung ;)
Wenn du eine 1:1 Beziehung zwischen Schlüssel und Wert hast, könntest du auch "einfach" zwei Dictionaries benutzen, mit jeweils vertauschten Positionen. Aber ob das nun besonders effizient ist, lass ich mal dahingestellt. Ich selbst verwende das in einem Programm mit nem Dictionary mit gut 1000 Einträgen und merke nichts von Einbußen in der Geschwindigkeit, lasse mich aber gerne eines Besseren belehren.