2010-10-23 18 views
25

शब्दकोश मूल्य का उपयोग करके शब्दकोश कुंजी कैसे प्राप्त करें?शब्दकोश मूल्य का उपयोग कर शब्दकोश कुंजी प्राप्त करें

जब कुंजी इस तरह अपने का उपयोग कर मूल्य मिल रहा है:

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

dic.Add(1, "a"); 

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

कैसे विपरीत करना है?

+0

[सामान्य जेनेरिक शब्दकोश के मूल्य की कुंजी प्राप्त करना] के संभावित डुप्लिकेट? (Http://stackoverflow.com/questions/255341/getting-key-of-value-of-a-generic-dictionary) – bluish

उत्तर

61

एक शब्दकोश वास्तव में कुंजी-> मान से एक तरफ देखने के लिए है।

आप विपरीत उपयोग LINQ कर सकते हैं:

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

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

एहसास वहाँ एक ही मूल्य के साथ कई कुंजी हो सकता है, इसलिए किसी भी उचित खोज कुंजियों का संग्रह वापस आ जाएगी (जिसके कारण foreach ऊपर मौजूद है) ।

+2

एएसी, बीट मुझे 35 सेकंड तक! :) –

+0

मैं अनुमान लगाने जा रहा हूं कि यह प्रत्येक के लिए keyvaluepairs के माध्यम से संभवतः तेज है लेकिन हू के आसपास शब्दकोश को उलटने से तेज़ नहीं है? जिज्ञासा से बाहर निकलने के लिए मुझे खुद को बेंच करना होगा, लेकिन यह सिर्फ अलग-अलग शब्दकोष को सही बना देगा? – user99999991

+1

@ user999999928 यह मूल रूप से शब्दकोश के रूप में एक foreach करने के समान ही है। यदि आप बहुत सारे लुकअप करने जा रहे हैं, तो "रिवर्सड" डिक्शनरी (जिसके लिए मूल्य के लिए संग्रह की आवश्यकता है) बनाना, लुकअप को तेज़ी से बना देगा, लेकिन दोनों में सम्मिलन/परिवर्तनों को संभालना होगा। –

21

ब्रूट फोर्स।

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

+1 ब्रूट फोर्स के लिए;) –

+4

int key = dic.FirstOrDefault (kvp => kvp.Value == "a")। कुंजी; – cilerler

+1

जो उस मान के साथ कोई कुंजी नहीं है, तो अपवाद फेंक देगा। ('FirstOrDefault' शून्य वापस आता है, आप शून्य के '.ey'' लेते हैं) –

10

तुम भी

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; 
    } 
} 

के उपयोग में भी इतना आसान

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

+1) क्योंकि ज़ैन एक्सटेंशन विधियों के माध्यम से इसे लागू करने का एक नया तरीका बता रहा है। – Singleton

2

के लिए आसान तरीका है मूल्य द्वारा शब्दकोश से कुंजी प्राप्त करने के लिए निम्न एक्सटेंशन विधि का उपयोग कर सकते हैं एक कुंजी:

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

और गुणकों चाबी के लिए:

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

मुझे पता है यह एक पुराने सवाल है, लेकिन कुछ मैं के बारे में सोचा जोड़ना चाहते थे।

यदि आप जानते हैं कि एक मूल्य के लिए केवल एक ही कुंजी होगी और आपको मूल्य के साथ-साथ कुंजी के माध्यम से देखना होगा; आप दो अलग-अलग शब्दकोश बना सकते हैं। एक मूल कुंजी के साथ कुंजी के रूप में कुंजी और मान के रूप में कुंजी और कुंजी के रूप में कुंजी के रूप में दूसरा।

अब इसके बारे में एक पक्ष नोट; यह अधिक मशीन संसाधनों का उपयोग करता है लेकिन मैं अनुमान लगा रहा हूं कि यह LINQ और foreach के माध्यम से मजबूर कर रहा है।

संबंधित मुद्दे