2010-06-17 11 views
21

सी # में उपयोग करने के लिए मुझे अपने आप को List<T>, IList<T> या IEnumerable<T> 99% समय का उपयोग करना पड़ता है। क्या कोई ऐसा मामला है जब HashTable (या Dictionary<T,T> 2.0 और ऊपर) का उपयोग करने के लिए टी बेहतर होगा?जब हैशटेबल

संपादित करें:

के रूप में बताया, कि किसी व्यक्ति को संग्रह के साथ करना चाहते हैं अक्सर तय क्या एक का उपयोग किया जाना चाहिए, तो जब आप एक List<T> पर एक Hashtable/Dictonary<T,T> का प्रयोग करेंगे?

उत्तर

16

हो सकता है कि सीधे ऑप्स प्रश्न से संबंधित नहीं है, लेकिन वहाँ जो संग्रह संरचना पर उपयोग करने के लिए के बारे में एक उपयोगी ब्लॉग पोस्ट है: SortedSets

असल में, क्या आप संग्रह के साथ क्या करना चाहते हैं निर्धारित करता है संग्रह की किस प्रकार आप बनाना चाहिए ।

और अधिक विस्तार में संक्षेप में प्रस्तुत करने के लिए:

  • उपयोग IList अगर आप की गणना और/या संशोधित करने के लिए संग्रह
  • उपयोग IEnumeration (सामान्य रूप से सूची के अंत में जोड़ने) यदि आप केवल करना चाहते हैं सक्षम होना चाहते हैं संग्रह (जोड़ें/निकालें की जरूरत नहीं है - आम तौर पर एक वापसी प्रकार के रूप में इस्तेमाल) की गणना
  • उपयोग IDictionary आप (जोड़ने/एक कुंजी का उपयोग कर जल्दी से तत्वों को हटाने)
  • उपयोग SortedSet एक कुंजी के द्वारा तत्वों का उपयोग करना चाहते हैं यदि आप एक संग्रह प्राप्त करना चाहते हैं एक पूर्वनिर्धारित क्रम में (क्रम में संग्रह तक पहुंचने के लिए सबसे आम उपयोग)

  • कुल मिलाकर, यदि आप किसी विशेष क्रम में कुंजी द्वारा आइटम्स को एक्सेस/संशोधित करना चाहते हैं तो शब्दकोश का उपयोग करें (सूची में पसंदीदा रूप में क्रमशः किया गया है , गणन अधिक पसंद के रूप में है कि सख्ती से टाइप नहीं है कि आप एक गणन, hashtable से अधिक पसंद संशोधित नहीं कर सकते के रूप में, sortedlist से अधिक पसंद है जब आप हल कर कुंजी)

+1

अन्य संग्रहों से समूह को और अलग करने के लिए: एक सेट इसके अंदर डुप्लिकेट तत्वों की अनुमति नहीं देता है (और सॉर्टेडसेट इत्यादि आपको यह बताने के लिए अपवाद नहीं फेंक देगा, लेकिन .एड() आपको बुलियन को बताने के लिए वापस करेगा)। इसलिए जब आप कुछ मामलों में ऑर्डर की गई सूची चाहते हैं, तो सॉर्टेडसेट उपयोग करने के लिए आदर्श संग्रह नहीं हो सकता है। –

6

हां, जब आपको कुंजी द्वारा आइटम को तेज़ी से देखने में सक्षम होना चाहिए।

बेशक

, आप मिलान कुंजी के लिए एक IList या IEnumerable आदि के माध्यम से खोज सकते हैं लेकिन यह है कि (1) Hashtable या Dictionary के लिए हे (एन) ले जाएगा समय के बजाय हे।

0

आप वास्तव में एक ही चीजों की तुलना नहीं कर रहे हैं, जब मैं एक शब्दकोश का उपयोग करता हूं क्योंकि मैं डेटा के लिए एक लुकअप देखना चाहता हूं, आमतौर पर मैं वस्तुओं की एक सूची स्टोर करना चाहता हूं और मैं उन्हें तुरंत देखने में सक्षम होना चाहता हूं किसी तरह की कुंजी का उपयोग कर ऊपर।

9

आप एक हैशटेबल (शब्दकोश) का उपयोग करते हैं जब आप किसी कुंजी पर आधारित किसी आइटम तक तेज़ी से पहुंच देखना चाहते हैं।

यदि आप List, IList or IEnumerable का उपयोग कर रहे हैं तो आम तौर पर इसका मतलब है कि आप डेटा पर लूपिंग कर रहे हैं (अच्छी तरह से IENumerable के मामले में यह निश्चित रूप से इसका मतलब है), और हैशटेबल आपको कुछ भी शुद्ध नहीं करेगा। अब यदि आप एक सूची में एक मूल्य देख रहे थे और किसी अन्य सूची में डेटा तक पहुंचने के लिए इसका उपयोग कर रहे थे, तो यह थोड़ा अलग होगा। उदाहरण के लिए:

  1. आइटम foo की सूची में स्थिति पाएं।
  2. foo के लिए सूची में स्थिति किसी अन्य सूची में स्थिति के अनुरूप है जिसमें Foo_Value शामिल है।
  3. Foo_Value प्राप्त करने के लिए सेकंड सूची में एक्सेस स्थिति।

यहां एक link विभिन्न डेटाटाइप का वर्णन करता है।

Another link.

1

हैश-टेबल अगर आप अक्सर " संग्रह में कुछ के लिए" क्या कर रहे हैं अच्छे विकल्प हैं और आप संग्रह में आइटम के आदेश के बारे में चिंतित नहीं हैं।

हैश-टेबल इंडेक्स हैं। आप किसी सूची को इंडेक्स करने के लिए हैश-टेबल को बनाए रख सकते हैं, ताकि आप दोनों इसे क्रम में या यादृच्छिक रूप से कुंजी के आधार पर एक्सेस कर सकें।

0

मैं hashtables का उपयोग अक्सर वापस कुंजी भेजने की जरूरत नहीं है/पृष्ठ विधियों के माध्यम से जावास्क्रिप्ट को मूल्य संग्रह।

शब्दकोश कैशिंग चीजों के लिए शब्दकोश अच्छे होते हैं जब आपको अपनी आईडी को दिए गए ऑब्जेक्ट को पुनर्प्राप्त करने की आवश्यकता होती है लेकिन डेटाबेस को हिट नहीं करना चाहते हैं: मान लें कि आपके संग्रह को बड़ी संख्या में टक्कर और आपके डेटा की ज़रूरतों को प्रेरित करने के लिए पर्याप्त नहीं है बहुत धीमी होने के लिए अक्सर एक IENumerable के लिए पर्याप्त पुनर्प्राप्त, शब्दकोश एक सभ्य गति प्रदान कर सकते हैं।

0

जानते हुए भी क्या संग्रह के लिए है बिना वास्तव में बताने का कोई तरीका नहीं है, लेकिन आप एक hashtable उपयोग नहीं कर सकते जब तक कि अपने संग्रह में आइटम अद्वितीय हैं, वहाँ के रूप में एक प्रमुख के रूप में उपयोग करने के लिए कुछ भी नहीं किया जाएगा। तो शायद आप जिस अंगूठे की तलाश में हैं, वह यह है कि यदि आपके सदस्य सभी अलग हैं और आप व्यक्तिगत उदाहरणों को कुंजी से बाहर खींचना चाहते हैं, तो हैशटेबल का उपयोग करें। यदि आपके पास ऐसी वस्तुओं का एक गुच्छा है जो आप उसी तरह से इलाज करना चाहते हैं (जैसे पूरे सेट पर फ़ोरैच करना) एक सूची का उपयोग करें।

0

हैशटेबल लुकअप को अनुकूलित करता है। यह आपके द्वारा जोड़े गए प्रत्येक कुंजी का हैश की गणना करता है। यह तत्व को बहुत तेज़ी से देखने के लिए इस हैश कोड का उपयोग करता है। यह एक पुराना .NET फ्रेमवर्क प्रकार है। यह जेनेरिक शब्दकोश प्रकार से धीमा है।

+0

क्या आपके पास हैशटेबल धीमे होने का संदर्भ है? –

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