| 

.NET C# Java Javascript Exception

3
Wie kann ich (effizient) den Schlüssel eines Dictionary's für einen bestimmten Wert erhalten?
News:
05.09.2009
Serda 455 2 7
3 Antworten
2
Mit der GetKeyByValue-Erweiterungsmethode ;)
Dictionary<int, string> dic = new Dictionary<int, string>();
dic[1] = "a";
dic[2] = "b";

int key = dic.GetKeyByValue("a");


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;

return query.FirstOrDefault();
}
}
05.09.2009
gfoidl 9,4k 3 5
gfoidl 9,4k 3 5
Das dürfte O(n) sein. Sollte ein Dictionary nicht O(1) Zugriff schaffen?
Serda 06.09.2009
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).
gfoidl 06.09.2009
1
dic.ToList().FirstOrDefault(x => x.Value == "bla");


Da würde ich mir keine Erweiterung extra schreiben ;-)
06.09.2009
Rene Drescher-Hackel 1,1k 1 8
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 ;)
gfoidl 06.09.2009
1
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.
07.09.2009
JackDMF 21 1 2

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH