c# - मूल्य से शब्दकोश कुंजी प्राप्त करें




dictionary (6)

संभावित डुप्लिकेट:
एक सामान्य शब्दकोश के मूल्य की कुंजी प्राप्त करना?

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

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

मुझे ऐसा कुछ चाहिए:

getByValueKey(string value);

getByValueKey("one") वापसी "1" होना चाहिए।

ऐसा करने का सबसे अच्छा तरीका क्या है? शायद हैशटेबल, सॉर्टेडलिस्ट?


आप यह कर सकते हैं:

  1. शब्दकोश में सभी KeyValuePair<TKey, TValue> माध्यम से लूप करके (यदि आपके पास शब्दकोश में कई प्रविष्टियां हैं तो एक बड़ा प्रदर्शन हिट होगा)
  2. दो शब्दकोशों का प्रयोग करें, एक मूल्य-से-कुंजी मैपिंग के लिए और एक कुंजी-टू-वैल्यू मैपिंग के लिए (जो मेमोरी में दोगुनी जगह ले लेगा)।

यदि प्रदर्शन पर विचार नहीं किया गया है तो विधि 1 का उपयोग करें, अगर स्मृति विचार नहीं है तो विधि 2 का उपयोग करें।

साथ ही, सभी कुंजी अद्वितीय होनी चाहिए, लेकिन मानों को अद्वितीय होने की आवश्यकता नहीं है। आपके पास निर्दिष्ट मान के साथ एक से अधिक कुंजी हो सकती है।

क्या कोई कारण है कि आप कुंजी-मूल्य संबंधों को उलट नहीं सकते?


ऐसा करने के लिए मेरे पास बहुत आसान तरीका है। यह मेरे लिए बिल्कुल सही काम किया।

Dictionary<string, string> types = new Dictionary<string, string>();

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

मूल्यों को अनन्य रूप से अद्वितीय नहीं होना चाहिए ताकि आपको एक लुकअप करना पड़े। आप ऐसा कुछ कर सकते हैं:

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

यदि मान अद्वितीय हैं और पढ़ने से कम बार डाले जाते हैं, तो एक व्यस्त शब्दकोश बनाएं जहां मान कुंजी हैं और कुंजी मान हैं।


मैं ऐसी परिस्थिति में था जहां लिंक बाध्यकारी उपलब्ध नहीं था और उसे स्पष्ट रूप से लैम्ब्डा का विस्तार करना पड़ा। इसके परिणामस्वरूप एक साधारण कार्य हुआ:

public static string KeyByValue(Dictionary<string, string> dict, string val)
{
    string key = null;
    foreach (KeyValuePair<string, string> pair in dict)
    {
        if (pair.Value == val)
        { 
            key = pair.Key; 
            break; 
        }
    }
    return key;
}

इसे निम्न तरह से कॉल करें:

public static void Main()
{
    Dictionary<string, string> dict = new Dictionary<string, string>()
    {
        {"1", "one"},
        {"2", "two"},
        {"3", "three"}
    };

    string key = KeyByValue(dict, "two");       
    Console.WriteLine("Key: " + key);
}

.NET 2.0 और अन्य सीमित वातावरण में काम करता है।


क्या होगा यदि मान एक से अधिक कुंजी के लिए मौजूद है?

कौन सी कुंजी वापस आनी चाहिए?

धारणाओं से बचने के लिए माइक्रोसॉफ्ट में GetKey विधि शामिल नहीं है।


types.Values.ToList().IndexOf("one");

Values.ToList () आपके शब्दकोश मानों को वस्तुओं की सूची में परिवर्तित करता है। इंडेक्सऑफ ("एक") आपकी नई सूची को "एक" की तलाश में खोजता है और इंडेक्स देता है जो कुंजीपटल में कुंजी / वैल्यू जोड़ी के सूचकांक से मेल खाता है।

इस विधि को कुंजीपटल कुंजियों की परवाह नहीं है, यह केवल उस मान की अनुक्रमणिका देता है जिसे आप ढूंढ रहे हैं।

ध्यान रखें कि आपके शब्दकोश में एक से अधिक "एक" मान हो सकता है। और यही कारण है कि कोई "कुंजी प्राप्त करें" विधि नहीं है।







dictionary