2012-05-15 8 views
7

मेरे पास सी # में जेनेरिक संग्रह के बारे में कोई प्रश्न है। अगर मुझे वस्तुओं का संग्रह संग्रहित करने की आवश्यकता है, और मुझे अक्सर यह जांचने की आवश्यकता होगी कि कोई आइटम संग्रह में है या नहीं, तो सूची के बजाय शब्दकोश का उपयोग करना तेज़ होगा?शब्दकोश का उपयोग <Foo, Foo> सूची के बजाय <Foo> के लिए कॉल को गति देने के लिए()

मैंने सुना है कि संग्रह में कोई आइटम सूची में है या नहीं, जो सूचियों के आकार के अनुरूप रैखिक है और शब्दकोशों के आकार के अनुरूप है। शब्दकोश का उपयोग कर रहा है और फिर प्रत्येक कुंजी-मूल्य जोड़ी के लिए एक ही ऑब्जेक्ट की कुंजी और मान सेट कर रहा है जो अन्य प्रोग्रामर अक्सर इस स्थिति में करते हैं?

इसे पढ़ने के लिए समय निकालने के लिए धन्यवाद।

+1

सूची में कितने आइटम हैं? यदि आपके पास 100 है, तो यह पूर्व-अनुकूलन होगा, और इससे कोई फर्क नहीं पड़ता। –

+0

आप 'डायशक्शन 'का उपयोग कर रहे हैं' हैशसेट ', जो तकनीकी रूप से तेज़ होना चाहिए, लेकिन आपको किसी भी तरह से' स्टॉपवॉच 'का उपयोग करके उनकी तुलना करनी चाहिए। – BeemerGuy

+0

डुप्लिकेट। Http://stackoverflow.com/questions/1009107/what-net-collection-provides-the-fastest-search देखें। – JamieSee

उत्तर

5

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

यह भी लायक यह देखते हुए कि Dictionary सी # 2.0 में जोड़ा गया है, और HashSet, 3.5 में जोड़ा गया था कि सभी समय inbetween यह वास्तव में काफी एक शब्दकोश का उपयोग करने के लिए जब आप एक सेट चाहता था आम था सिर्फ इसलिए कि तुम सब किया था के लिए बहुत (अपने खुद के रोलिंग के बिना)। जब मुझे ऐसा करने के लिए मजबूर किया गया तो मैं आइटम की बजाय कुंजी और मूल्य के रूप में मूल्य में शून्य हो गया, लेकिन विचार वही है।

+0

धन्यवाद दोस्तों! यह वही है जो मुझे जानने की जरूरत है। मुझे पूरा यकीन था कि शब्दकोश का उपयोग करने से ऐसा करने का एक क्लीनर, साफ-सुथरा तरीका था। –

5

यदि आप चिंतित हैं तो तेजी से रोकथाम परीक्षण है तो बस HashSet<Foo> का उपयोग करें।

Dictionary<TKey, TValue> एक कुंजी के आधार पर एक मूल्य को देखने के लिए है।

List<T> यादृच्छिक पहुंच और गतिशील विकास गुणों के लिए है।

HashSet<T> एक सेट मॉडलिंग और तेजी से रोकथाम परीक्षण प्रदान करने के लिए है।

आप एक कुंजी के आधार पर एक मूल्य नहीं देख रहे हैं। आप यादृच्छिक अभिगम के बारे में चिंतित नहीं हैं, बल्कि तेजी से रोकथाम की जांच करते हैं। यहां सही अवधारणा HashSet<T> है।

3

एक शब्दकोश, या हैशसेट अधिक मेमोरी का उपयोग करेगा, लेकिन (लगभग) ओ (1) समय की तलाश करेगा।

5

मानते हैं कि सूची में आइटम की केवल एक प्रति है, तो उपयुक्त डेटा संरचना ISet<T> है, विशेष रूप से HashSet<T>

उस ने कहा, मैंने समय देखा है कि Dictionary<TKey, TValue>ContainsKey कॉल HashSet<T> से भी तेज तेज है। किसी भी तरह से, दोनों एक सादे List<T> लुकअप से तेज़ लोड होने जा रहे हैं।

ध्यान रखें कि इन तरीकों (HashSet और शब्दकोश) के दोनों T के लिए यथोचित अच्छी तरह से लागू किया EqualsऔरGetHashcode कार्यान्वयन पर भरोसा रखें। List<T> केवल Equals

2

पर निर्भर करता है आप HashSet पर देखना चाहते हैं, जो अद्वितीय वस्तुओं का संग्रह है (जब तक ऑब्जेक्ट आईक्वालिटी तुलनाकर्ता लागू करता है)।

1

आप List<T> का उपयोग करके उल्लेख करते हैं, जिसका अर्थ है कि आदेश महत्वपूर्ण हो सकता है। यदि यह मामला है तो आप SortedSet<T> प्रकार भी देख सकते हैं।

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