2010-10-23 8 views
25

Wie erhalten Sie den Wörterbuchschlüssel mit dem Wörterbuch Wert?Get Dictionary-Taste mit dem Wörterbuch-Wert

wenn immer den Wert mit dem Schlüssel seiner wie folgt aus:

Dictionary<int, string> dic = new Dictionary<int, string>(); 

dic.Add(1, "a"); 

Console.WriteLine(dic[1]); 
Console.ReadLine(); 

Wie das Gegenteil zu tun?

+0

mögliche Duplikate von [Schlüssel des Wertes eines generischen Wörterbuchs erhalten?] (Http://stackoverflow.com/questions/255341/getting-key-of-value-of-a-generic-dictionary) – bluish

Antwort

61

Ein Wörterbuch ist wirklich für One-Way-Lookup von Key-> Value gedacht.

können Sie tun das Gegenteil Verwendung LINQ:

var keysWithMatchingValues = dic.Where(p => p.Value == "a").Select(p => p.Key); 

foreach(var key in keysWithMatchingValues) 
    Console.WriteLine(key); 

erkennen, dass es mit dem gleichen Wert mehrere Schlüssel sein kann, so dass jeder die richtige Suche wird eine Sammlung von Schlüsseln zurückzukehren (weshalb die foreach oben vorhanden) .

+2

ack, beat ich um 35 Sekunden! :) –

+0

Ich werde raten, dass dies wahrscheinlich schneller ist als ein für jeden durch keyvaluepairs, aber ist nicht schneller als das Wörterbuch um huh umzukehren? Ich muss es selbst ausrechnen, nur um aus Neugier zu sehen, aber es wäre schneller, nur das Wörterbuch anders zu machen, oder? – user99999991

+1

@ user999999928 Dies ist im Prinzip das gleiche wie eine Foreach obwohl das Wörterbuch. Wenn Sie viele Nachschlagevorgänge durchführen, würde das Erstellen eines "umgekehrten" Wörterbuchs (das eine Sammlung nach Wert erfordert) Suchen schneller machen, aber Einfügungen/Änderungen müssten in beiden Fällen gehandhabt werden. –

21

Brute-Kraft.

 int key = dic.Where(kvp => kvp.Value == "a").Select(kvp => kvp.Key).FirstOrDefault(); 
+2

+1 Für Brute Force;) –

+4

int key = dic.FirstOrDefault (kvp => kvp.Value == "a"). – cilerler

+1

, die eine Ausnahme auslöst, wenn es keinen Schlüssel mit diesem Wert gibt. ('FirstOrDefault' gibt null zurück, du nimmst' .Key' von null) –

10

Sie können auch die folgenden Erweiterungsmethode verwenden Schlüssel aus Wörterbuch von Wert für get

public static class Extensions 
{ 
    public static bool TryGetKey<K, V>(this IDictionary<K, V> instance, V value, out K key) 
    { 
     foreach (var entry in instance) 
     { 
      if (!entry.Value.Equals(value)) 
      { 
       continue; 
      } 
      key = entry.Key; 
      return true; 
     } 
     key = default(K); 
     return false; 
    } 
} 

die Verwendung auch

int key = 0; 
if (myDictionary.TryGetKey("twitter", out key)) 
{ 
    // successfully got the key :) 
} 
+0

+1), da Zain eine neue Methode vorgibt, dies über Erweiterungsmethoden zu implementieren. – Singleton

2

einfache Möglichkeit, so einfach zu bekommen ein Schlüssel:

und für Multiples Tasten:

public static TKey[] GetKeys<TKey, TValue>(Dictionary<TKey, TValue> dictionary, TValue Value) 
    { 
     List<TKey> KeyList = new List<TKey>(dictionary.Keys); 
     List<TKey> FoundKeys = new List<TKey>(); 
     foreach (TKey key in KeyList) 
      if (dictionary[key].Equals(Value)) 
       FoundKeys.Add(key); 
     if (FoundKeys.Count > 0) 
      return FoundKeys.ToArray(); 
     throw new KeyNotFoundException(); 
    } 
0

Ich weiß, das eine alte Frage, aber wollte etwas, was ich gedacht hinzuzufügen.

Wenn Sie wissen, dass es nur einen Schlüssel zu einem Wert geben wird, müssen Sie sowohl über den Wert als auch über den Schlüssel nachsehen; Sie können zwei separate Wörterbücher erstellen. Einer mit dem ursprünglichen Schlüssel als Schlüssel und Wert als Wert und der zweite mit dem Schlüssel als Wert und Wert als Schlüssel.

Jetzt eine Randnotiz darüber; Es verbraucht mehr Maschinenressourcen, aber ich schätze, es ist schneller als Brute-Forcing durch LINQ und foreach.