C# हैशटेबल उदाहरणों के साथ

⚡ स्मार्ट सारांश

C# में हैशटेबल, System.Collections नेमस्पेस से एक कलेक्शन है जो डेटा को कुंजी-मान युग्मों के रूप में संग्रहीत करता है, जहां प्रत्येक अद्वितीय कुंजी एक मान से मैप होती है और कुंजी उस संग्रहीत मान की त्वरित खोज प्रदान करती है।

  • 📚 कुंजी-मान युग्म: हैशटेबल में स्टैक या ऐरे लिस्ट द्वारा रखे गए एकल मान के बजाय, प्रत्येक तत्व में दो मान संग्रहीत होते हैं, एक कुंजी और उसका मान।
  • तत्व जोड़ना: ऐड विधि एक कुंजी और एक मान को एक साथ सम्मिलित करती है, और हैशटेबल के भीतर प्रत्येक कुंजी अद्वितीय होनी चाहिए।
  • ???? ContainsKey और ContainsValue: ये विधियाँ true या false लौटाती हैं, जिससे आप यह जांच सकते हैं कि कोई कुंजी या मान पहले से मौजूद है या नहीं।
  • 🔁 पठन मान: ICollection या DictionaryEntry लूप के साथ Keys प्रॉपर्टी का उपयोग करके आप बारी-बारी से प्रत्येक संग्रहित मान को पढ़ सकते हैं।
  • विधियाँ और गुणधर्म: Remove, Clear, Count, Keys और Values, हैशटेबल की सामग्री को प्रबंधित और जांचने के लिए उपयोग किए जाते हैं।
  • 🤖 एआई सहायता: GitHub Copilot हैशटेबल कोड का ढांचा तैयार करता है, जबकि आधुनिक C# और ML.NET टाइप-सेफ की-वैल्यू डेटा के लिए जेनेरिक डिक्शनरी को प्राथमिकता देते हैं।

सी# हैशटेबल

C# में हैशटेबल क्या है?

हैश टेबल एक विशेष संग्रह है जिसका उपयोग कुंजी-मूल्य आइटम को संग्रहीत करने के लिए किया जाता है। इसलिए स्टैक, सरणी सूची और कतार जैसे केवल एक मान को संग्रहीत करने के बजाय, हैश टेबल 2 मान संग्रहीत करता है। ये 2 मान हैश टेबल का एक तत्व बनाते हैं।

नीचे कुछ उदाहरण दिए गए हैं कि हैश तालिका के मान कैसे दिख सकते हैं।

{ "001" , ".Net" }
{ "002" , ".C#" }
{ "003" , "ASP.Net" }

ऊपर हमारे पास 3 कुंजी मान जोड़े हैं। प्रत्येक तत्व की कुंजियाँ क्रमशः 001, 002 और 003 हैं। प्रत्येक कुंजी मान जोड़े के मान “नेट.“, “सी#” और “एएसपी.नेट” क्रमशः।

आइए हैशटेबल संग्रह के लिए उपलब्ध कार्यों को अधिक विस्तार से देखें।

हैशटेबल की घोषणा

हैशटेबल की घोषणा नीचे दी गई है। हैशटेबल डेटाटाइप की मदद से हैशटेबल बनाया जाता है। हैशटेबल का ऑब्जेक्ट बनाने के लिए “new” कीवर्ड का इस्तेमाल किया जाता है। फिर ऑब्जेक्ट को ht वेरिएबल को असाइन किया जाता है।

Hashtable ht = new Hashtable()

हैशटेबल में तत्व जोड़ना

Add विधि का उपयोग किसी तत्व को जोड़ने के लिए किया जाता है पंक्तिकथन का सामान्य वाक्यविन्यास नीचे दिया गया है

HashTable.add("key","value")

उदाहरण 1:

याद रखें कि हैश तालिका के प्रत्येक तत्व में दो मान होते हैं, एक कुंजी और दूसरा मान।

अब, आइए इसे कोड स्तर पर काम करते हुए देखें। नीचे दिए गए सभी कोड हमारे कंसोल एप्लिकेशन में लिखे जाएंगे।

कोड हमारी Program.cs फ़ाइल में लिखा जाएगा। नीचे दिए गए प्रोग्राम में, हम कोड लिखेंगे ताकि हम देख सकें कि हम ऊपर बताए गए तरीकों का उपयोग कैसे कर सकते हैं।

अभी हमारे उदाहरण में, हम केवल यह देखेंगे कि हम हैशटेबल कैसे बना सकते हैं, हैशटेबल में तत्व कैसे जोड़ सकते हैं और उन्हें तदनुसार प्रदर्शित कर सकते हैं।

C# में हैशटेबल

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   ICollection keys = ht.Keys;

   foreach (String k in keys)
   {
    Console.WriteLine(ht[k]);
   }
    Console.ReadKey();
   }
 }
}

Code स्पष्टीकरण: -

  1. सबसे पहले, हम कीवर्ड “New” का उपयोग करके Hashtable डेटा प्रकार का उपयोग करके हैशटेबल वैरिएबल घोषित करते हैं। परिभाषित वैरिएबल का नाम 'ht' है।
  2. फिर हम Add विधि का उपयोग करके हैश टेबल में तत्व जोड़ते हैं। याद रखें कि हैशटेबल में कुछ जोड़ते समय हमें कुंजी और मान दोनों तत्व जोड़ने की आवश्यकता होती है।
  3. हैश तालिका के तत्वों को प्रदर्शित करने का कोई सीधा तरीका नहीं है।
    • हैशटेबल प्रदर्शित करने के लिए, हमें सबसे पहले हैश टेबल से कुंजियों (001, 002 और 003) की सूची प्राप्त करनी होगी।
    • यह ICollection इंटरफ़ेस के ज़रिए किया जाता है। यह एक विशेष डेटा प्रकार है जिसका उपयोग हैशटेबल संग्रह की कुंजियों को संग्रहीत करने के लिए किया जा सकता है। फिर हम हैशटेबल संग्रह की कुंजियों को 'keys' चर में असाइन करते हैं।
  4. इसके बाद, प्रत्येक कुंजी मान के लिए, हम कथन ht[k] का उपयोग करके हैशटेबल में संबद्ध मान प्राप्त करते हैं।

यदि उपरोक्त कोड ठीक से दर्ज किया गया है और प्रोग्राम चलाया गया है तो निम्नलिखित आउटपुट प्रदर्शित होगा।

आउटपुट:

C# में हैशटेबल

आइए हैश तालिकाओं के लिए उपलब्ध कुछ और तरीकों पर नजर डालें।

इसमें कुंजी शामिल है

इस विधि का उपयोग यह देखने के लिए किया जाता है कि हैशटेबल में कोई कुंजी मौजूद है या नहीं। नीचे इस कथन का सामान्य सिंटैक्स दिया गया है। यदि कुंजी मौजूद है तो कथन सत्य लौटाएगा, अन्यथा यह मान गलत लौटाएगा।

Hashtable.Containskey(key)

इसमें शामिल हैमूल्य

इस विधि का उपयोग यह देखने के लिए किया जाता है कि हैशटेबल में कोई मान मौजूद है या नहीं। नीचे इस कथन का सामान्य सिंटैक्स दिया गया है। यदि मान मौजूद है तो कथन सत्य लौटाएगा, अन्यथा यह मान गलत लौटाएगा।

Hashtable.ContainsValue(value)

उदाहरण 2:

आइये अपना कोड बदलें सांत्वना आवेदन यह दिखाने के लिए कि हम “Containskey” और “ContainsValue” विधि का उपयोग कैसे कर सकते हैं।

C# में हैशटेबल

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   Console.WriteLine(ht.ContainsKey("001"));
   Console.WriteLine(ht.ContainsValue("C#"));
   Console.ReadKey();
   }
 }
}

Code स्पष्टीकरण: -

  1. सबसे पहले, हम ContainsKey विधि का उपयोग करके यह देखते हैं कि कुंजी हैशटेबल में मौजूद है या नहीं। यदि कुंजी हैशटेबल में मौजूद है, तो यह विधि सत्य लौटाएगी। इस विधि को सत्य लौटाना चाहिए क्योंकि कुंजी हैशटेबल में मौजूद है।
  2. फिर हम ContainsValue विधि का उपयोग करके यह देखते हैं कि मान हैशटेबल में मौजूद है या नहीं। यह विधि 'सत्य' लौटाएगी क्योंकि मान हैशटेबल में मौजूद है।

यदि उपरोक्त कोड ठीक से दर्ज किया गया है और प्रोग्राम चलाया गया है तो निम्नलिखित आउटपुट प्रदर्शित होगा।

आउटपुट:

C# में हैशटेबल

आउटपुट से आप स्पष्ट रूप से देख सकते हैं कि खोजी जा रही कुंजी और मान दोनों हैश तालिका में मौजूद हैं।

C# हैशटेबल के माध्यम से लूप कैसे करें

ऊपर दिए गए उदाहरणों में Keys कलेक्शन के माध्यम से मान पढ़े गए हैं, लेकिन Hashtable को अधिक सरल तरीके से पढ़ा जा सकता है। DictionaryEntry पर foreach लूप चलाने से आपको प्रत्येक तत्व की कुंजी और मान एक साथ मिल जाते हैं, जो Hashtable को पढ़ने का सबसे सामान्य तरीका है।

चरण 1) एक हैशटेबल बनाएं और उसमें तीन कुंजी-मान युग्म जोड़ें।

चरण 2) DictionaryEntry वेरिएबल का उपयोग करके हैशटेबल पर लूप चलाएं, फिर प्रत्येक प्रविष्टि के Key और Value गुणों को पढ़ें।

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("101", "Java");
   ht.Add("102", "Python");
   ht.Add("103", "Kotlin");

   foreach (DictionaryEntry entry in ht)
   {
    Console.WriteLine(entry.Key + " - " + entry.Value);
   }
   Console.ReadKey();
  }
 }
}

Code स्पष्टीकरण: -

  1. ht नाम की एक हैशटेबल बनाई जाती है, और Add विधि का उपयोग करके उसमें तीन कुंजी-मान युग्म डाले जाते हैं।
  2. foreach लूप प्रत्येक तत्व को एक DictionaryEntry को असाइन करता है, जिसके Key और Value गुण युग्म के दोनों हिस्सों को उजागर करते हैं।

जब प्रोग्राम चलता है, तो यह प्रत्येक कुंजी को उसके मान के बगल में प्रिंट करता है, जैसे कि 101 – Javaक्योंकि हैशटेबल प्रविष्टि क्रम को बनाए नहीं रखता है, इसलिए जोड़े उस क्रम से भिन्न क्रम में दिखाई दे सकते हैं जिस क्रम में उन्हें जोड़ा गया था। केवल कुंजियों को पढ़ने के लिए, कुंजी संग्रह पर लूप चलाएँ, और केवल मानों को पढ़ने के लिए, मान संग्रह पर लूप चलाएँ।

C# हैशटेबल विधियाँ और गुण

Hashtable क्लास कुछ चुनिंदा मेथड्स और प्रॉपर्टीज़ प्रदान करती है जो आपके लगभग सभी कार्यों को पूरा करती हैं, जैसे कि पेयर्स को जोड़ना और हटाना, मेंबरशिप की जाँच करना और एलिमेंट्स की गिनती करना। सबसे उपयोगी मेंबर्स नीचे सूचीबद्ध हैं।

सदस्य प्रकार विवरण
जोड़ें (कुंजी, मान) विधि एक नई कुंजी और मान युग्म सम्मिलित करता है; कुंजी अद्वितीय होनी चाहिए।
कुंजी हटाएँ विधि निर्दिष्ट कुंजी से मेल खाने वाले तत्व को हटाता है।
स्पष्ट() विधि हैशटेबल से सभी कुंजी-मान युग्मों को हटा देता है।
ContainsKey(key) विधि दी गई कुंजी मौजूद होने पर true लौटाता है।
ContainsValue(value) विधि दिया गया मान मौजूद होने पर true लौटाता है।
गिनती संपत्ति संग्रहीत कुंजी-मान युग्मों की संख्या प्राप्त करता है।
कुंजी संपत्ति सभी कुंजियों का एक संग्रह लौटाता है।
मान संपत्ति यह सभी मानों का एक संग्रह लौटाता है।

क्योंकि प्रत्येक कुंजी को हैश किया जाता है, इसलिए ContainsKey और इंडेक्सर लगभग स्थिर समय में एक तत्व का पता लगा लेते हैं, यही कारण है कि हैशटेबल तेज़ लुकअप के लिए इतना उपयोगी है।

C# में हैशटेबल और डिक्शनरी के बीच अंतर

हैशटेबल और डिक्शनरी दोनों ही कुंजी-मान युग्मों को संग्रहीत करते हैं, और दोनों ही C# के व्यापक परिवार से संबंधित हैं। संग्रहमहत्वपूर्ण अंतर टाइप सेफ्टी का है, और यही अंतर तय करता है कि नए कोड में आपको किसका उपयोग करना चाहिए।

  • टाइप सुरक्षा: हैशटेबल प्रत्येक कुंजी और मान को एक ऑब्जेक्ट के रूप में संग्रहीत करता है, जबकि डिक्शनरी ऐसा नहीं करती। यह जेनेरिक है, इसलिए कंपाइलर आपके द्वारा उपयोग किए जाने वाले प्रकारों की जांच करता है।
  • नाम स्थान: हैशटेबल System.Collections में रहता है, जबकि डिक्शनरी System.Collections.Generic में रहती है।
  • Boxआईएनजी: एक हैशटेबल int जैसे वैल्यू टाइप को बॉक्स में बंद कर देता है, लेकिन एक जेनेरिक डिक्शनरी उन्हें सीधे स्टोर करती है और उस लागत से बचाती है।
  • प्रदर्शन: डिक्शनरी आमतौर पर तेज़ होती है क्योंकि मान पढ़ते समय इसमें ऑब्जेक्ट से वापस कास्टिंग की आवश्यकता नहीं होती है।
  • धागे की सुरक्षा: हैशटेबल निम्नलिखित सुविधाएँ प्रदान करता है: Syncएक लेखक के लिए कई पाठकों के साथ क्रोनाइज्ड रैपर, जबकि समवर्ती कोड आमतौर पर कॉन्करेंट डिक्शनरी का चयन करता है।

किसी भी नए प्रोजेक्ट के लिए, जेनेरिक डिक्शनरी ही अनुशंसित विकल्प है, और नॉन-जेनेरिक हैशटेबल मुख्य रूप से पुराने कोड में ही दिखाई देता है।

अक्सर पूछे जाने वाले प्रश्न

Remove विधि दी गई कुंजी वाले तत्व को हटा देती है और Count को एक से घटा देती है। यदि कुंजी मौजूद नहीं है, तो कुछ नहीं होता, इसलिए जब आपको यह सुनिश्चित करना हो कि कुंजी मौजूद है, तो पहले ContainsKey को कॉल करें।

नहीं। हैशटेबल में प्रत्येक कुंजी अद्वितीय होनी चाहिए। पहले से मौजूद कुंजी के साथ 'ऐड' फ़ंक्शन कॉल करने पर आर्गुमेंटएक्सेप्शन उत्पन्न होता है। हालांकि, आप बिना किसी त्रुटि के एक ही मान को कई अलग-अलग कुंजियों के अंतर्गत संग्रहीत कर सकते हैं।

हैशटेबल एक राइटर और कई रीडर्स को सुरक्षित रूप से सपोर्ट करता है। कई राइटिंग थ्रेड्स के लिए, इसे हैशटेबल का उपयोग करके रैप करें।Syncआप क्रोनाइज्ड का उपयोग कर सकते हैं, या सिस्टम.कलेक्शंस.कॉन्करेंट से कॉन्करेंट डिक्शनरी को प्राथमिकता दे सकते हैं, जो बाहरी लॉक के बिना एक साथ पढ़ने और लिखने का काम संभालता है।

कुंजी द्वारा मान खोजने में औसतन लगभग स्थिर O(1) समय लगता है, क्योंकि कुंजी को उसके बकेट को खोजने के लिए हैश किया जाता है। भारी हैश टकराव इसे धीमा कर सकते हैं, लेकिन अच्छी तरह से वितरित कुंजियों के साथ ऐसा कम ही होता है।

वैल्यू null हो सकती है, लेकिन key null नहीं हो सकती। Add फ़ंक्शन या इंडेक्सर को null key पास करने पर ArgumentNullException उत्पन्न होता है। प्रत्येक key अद्वितीय होनी चाहिए और संग्रहीत होने के दौरान उसमें कोई परिवर्तन नहीं होना चाहिए।

हैशटेबल में कोई क्रम नहीं होता, इसलिए इसे सीधे सॉर्ट नहीं किया जा सकता। इसकी कुंजियों को किसी सूची या ऐरेलिस्ट में कॉपी करें, उस सूची को सॉर्ट करें, फिर कुंजी के अनुसार मान पढ़ें। सॉर्टेडलिस्ट में प्रविष्टियाँ स्वचालित रूप से क्रमबद्ध रहती हैं।

जी हां। GitHub Copilot एक छोटे से कमेंट या मेथड नाम से Hashtable डिक्लेरेशन, Add कॉल और DictionaryEntry लूप लिखता है। यह अक्सर जेनेरिक Dictionary का सुझाव देता है, क्योंकि नए C# कोड के लिए यही अनुशंसित कलेक्शन है।

ML.NET प्रशिक्षण डेटा हैशटेबल के बजाय टाइप किए गए संग्रह और IDataView पाइपलाइन के माध्यम से प्रवाहित होता है। हालांकि, हैश-आधारित कुंजी-मान मानचित्र अभी भी मशीन लर्निंग मॉडल के आसपास फीचर लुकअप, शब्दावली एन्कोडिंग और कैशिंग का समर्थन करते हैं।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: