प्रश्न का उत्तर देने के लिए पहले हमें एक शब्दकोश और अंतर्निहित प्रौद्योगिकी के उद्देश्य पर एक नज़र डालने की आवश्यकता है।
Dictionary
वह सूची है KeyValuePair<Tkey, Tvalue>
जहाँ प्रत्येक मूल्य को उसकी अद्वितीय कुंजी द्वारा दर्शाया जाता है। मान लीजिए कि हमारे पास आपके पसंदीदा खाद्य पदार्थों की एक सूची है। प्रत्येक मूल्य (भोजन का नाम) इसकी अनूठी कुंजी (एक स्थिति = आपको यह भोजन कितना पसंद है) द्वारा दर्शाया गया है।
उदाहरण कोड:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
मान लीजिए कि आप स्वस्थ रहना चाहते हैं, आपने अपना मन बदल लिया है और आप अपने पसंदीदा "बर्गर" को सलाद के साथ बदलना चाहते हैं। आपकी सूची अभी भी आपके पसंदीदा की सूची है, आप सूची की प्रकृति को नहीं बदलेंगे। आपका पसंदीदा सूची में नंबर एक बना रहेगा, केवल इसका मूल्य बदल जाएगा। जब आप इसे कहते हैं:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
लेकिन यह मत भूलो कि आप प्रोग्रामर हैं, और अब से आप अपने वाक्यों को पूरा करते हैं; आप emojis का उपयोग करने से इनकार करते हैं क्योंकि वे संकलन त्रुटि को फेंक देंगे और पसंदीदा की सभी सूची 0 सूचकांक आधारित है।
आपका आहार भी बदल गया! तो आप फिर से अपनी सूची में परिवर्तन करें:
/*you don't want to replace Salad, you want to add this new fancy 0
position to your list. It wasn't there before so you can either define it*/
myDietFavorites[0] = "Pizza";
/*or Add it*/
myDietFavorites.Add(0, "Pizza");
परिभाषित करने के साथ दो संभावनाएं हैं, आप या तो पहले मौजूद नहीं कुछ के लिए एक नई परिभाषा देना चाहते हैं या आप पहले से मौजूद परिभाषा को बदलना चाहते हैं।
जोड़ें विधि आपको एक रिकॉर्ड जोड़ने की अनुमति देती है, लेकिन केवल एक शर्त के तहत: इस परिभाषा की कुंजी आपके शब्दकोश में मौजूद नहीं हो सकती है।
अब हम हुड के नीचे देखने जा रहे हैं। जब आप एक डिक्शनरी बना रहे होते हैं, तो आपका कंपाइलर बाल्टी के लिए एक रिज़र्वेशन बनाता है (आपके रिकॉर्ड को स्टोर करने के लिए मेमोरी में रिक्त स्थान)। बाल्टी आपके द्वारा परिभाषित तरीके से कुंजियों को संग्रहीत नहीं करती है। प्रत्येक कुंजी को बकेट में जाने से पहले हैशट किया गया है (Microsoft द्वारा परिभाषित), इस बात का ध्यान रखें कि मूल्य भाग अपरिवर्तित रहता है।
मैं अपने उदाहरण को सरल बनाने के लिए CRC32 हैशिंग एल्गोरिथ्म का उपयोग करूँगा। जब आप परिभाषित करते हैं:
myDietFavorites[0] = "Pizza";
बाल्टी में क्या जा रहा है db2dc565 "पिज़्ज़ा" (सरलीकृत) है।
जब आप मान को इसमें बदलते हैं:
myDietFavorites[0] = "Spaghetti";
आपके पास अपना 0 है जो फिर db2dc565 है फिर आप अपने बाल्टी में इस मान को ढूंढते हैं कि क्या यह वहां है। यदि यह वहां है तो आप बस कुंजी को सौंपे गए मूल्य को फिर से लिखेंगे। यदि यह वहाँ नहीं है तो आप बाल्टी में अपना मूल्य रख देंगे।
जब आप अपने शब्दकोश में फ़ंक्शन जोड़ें जैसे कहते हैं:
myDietFavorite.Add(0, "Chocolate");
आप अपने 0 हैश की तुलना बाल्टी में रखने वालों से करते हैं। आप इसे बाल्टी में तभी रख सकते हैं जब यह वहां न हो ।
यह जानना महत्वपूर्ण है कि यह विशेष रूप से कैसे काम करता है यदि आप स्ट्रिंग या चार प्रकार की कुंजी के शब्दकोश के साथ काम करते हैं। हैशिंग से गुजरने के कारण यह संवेदनशील है। इसलिए उदाहरण के लिए "नाम"! = "नाम"। इसका चित्रण करने के लिए हमारे CRC32 का उपयोग करें।
"नाम" का
मान है: e04112b1 "नाम" का मान है: 1107fb5b