2008-10-13 13 views
29

क्या कोई भी सी # में उपलब्ध विभिन्न प्रकार की सूचियों को संक्षेप में समझाने के लिए एक अच्छा संसाधन जानता है और जब उनका उपयोग उपयुक्त है?मैं विभिन्न प्रकार की .NET सूचियों के बारे में कहां से सीख सकता हूं?

उदाहरण के लिए, सूची, Hashtable, शब्दकोश आदि

मैं काफी यकीन है कि जब मैं क्या उपयोग करना चाहिए कभी नहीं हूँ।

उत्तर

32

ये सभी सूचियां नहीं हैं, हालांकि वे सभी संग्रह हैं। यहां एक त्वरित सारांश है।

गैर सामान्य संग्रह (एपीआई object के संदर्भ में है मान प्रकार बॉक्सिंग कर रहे हैं

ये ज्यादातर System.Collections नाम स्थान में हैं:।।

  • ArrayList: मदों की एक सूची, द्वारा समर्थित एक सरणी। फास्ट यादृच्छिक पढ़ने/लिखने का उपयोग। पूंछ के अंत में तेजी से जोड़ें, यदि बफर को आकार बदलने की आवश्यकता नहीं है।
  • Hashtable: कुंजी से मानचित्र मूल्य। कुंजी अद्वितीय हैं, मानों को होना जरूरी नहीं है। ओ (1) पढ़ने/लिखने के उपयोग को प्राप्त करने के लिए GetHashCode विधि का उपयोग करता है (उन ग़लत मामलों से अलग जहां सभी वस्तुओं में एक ही हैश है, या बैकिंग स्टोर को पुनर्निर्माण की आवश्यकता है)। कुंजी/मूल्य जोड़े पर इटरेटिंग एक अप्रत्याशित आदेश देता है। (ठीक है, प्रभावी रूप से अप्रत्याशित।)
  • SortedList: हैशटेबल की तरह, लेकिन प्रविष्टियां हमेशा सॉर्ट-बाय-कुंजी ऑर्डर में लौटा दी जाती हैं। कुंजी/मूल्य जोड़े की सूची के रूप में संग्रहीत।
  • Stack: अंतिम-इन-फर्स्ट-आउट संग्रह
  • Queue: पहले-इन-फर्स्ट-आउट संग्रह
  • Array: फिक्स्ड आकार हे (1) यादृच्छिक अभिगम; गैर-जेनेरिक, लेकिन दृढ़ता से टाइप किए गए फॉर्म

जेनेरिक संग्रह। (दृढ़ता से टाइप एपीआई, नहीं बॉक्स मूल्य प्रकार (उपयुक्त टी संभालने जाएगा)

ये System.Collections.Generic namespace में ज्यादातर रहे हैं:।

  • List<T>: जैसे ArrayList
  • Dictionary<TKey, TValue>: Hashtable
  • तरह
  • SortedList<TKey, TValue> : सॉर्टेडलिस्ट
  • SortedDictionary<TKey, TValue>: सॉर्टेडलिस्ट की तरह, लेकिन कुंजी/मूल्य जोड़े के पेड़ के रूप में संग्रहीत किया जाता है जो कई परिस्थितियों में बेहतर प्रदर्शन देता है।अधिक जानकारी के लिए दस्तावेज़ देखें।
  • LinkedList<T>: दोगुना लिंक सूची (सिर और पूंछ तक शीघ्र पहुंच)
  • Stack<T>: जैसे ढेर
  • Queue<T>: जैसे कतार
  • ReadOnlyCollection<T>: जैसे सूची < टी> लेकिन केवल-पढ़ने के दृश्य देने

संभावित रूप से सबसे महत्वपूर्ण संग्रह इंटरफ़ेसIEnumerable (और IEnumerable<T>) है। यह एक धारा के अनुक्रम का प्रतिनिधित्व करता है जैसे कि स्ट्रीम बाइट्स के अनुक्रम का प्रतिनिधित्व करता है। कोई यादृच्छिक पहुंच नहीं है, बस आगे पढ़ने। LINQ से ऑब्जेक्ट्स इस पर आधारित है, और बहुत सारे संग्रह प्रकार इसे लागू करते हैं।

+1

सिस्टम भी है। चयन। अधिक उपहारों के साथ विशेषीकृत StringDictionary और NameValueCollection – Hafthor

+0

@ हाफ्थोर: हां, हालांकि उनमें से अधिकतर जेनेरिक के साथ कुछ हद तक अप्रचलित हो गए हैं। –

+3

बहुत अच्छी सूची <संग्रह प्रकार> आप इकट्ठे हुए हैं। मैंने जो कुछ भी कभी भी उपयोग किया है वह वहां है। – stephenbayer

2

यदि आप MSDN doco for System.Collections पर शुरू करते हैं, तो आप उन "सूचियों" और उनका उपयोग कैसे करें के बारे में अधिक जानकारी के लिए व्यक्तिगत संग्रह प्रकारों में ड्रिल कर सकते हैं। उदाहरण के लिए, Hashtable के लिए डॉको कहता है, "कुंजी के हैश कोड के आधार पर व्यवस्थित कुंजी/मूल्य जोड़े का संग्रह दर्शाता है।"

सिस्टम की एक अच्छी चर्चा भी है। चयन। Understanding Generics में जेनेरिक।

-3

इंटेलिसेंस आपको प्रत्येक के एक संक्षिप्त विवरण दिखाएगा यदि आप कोड कोड में System.collections.Generic. टाइप करते हैं। पिछली अवधि को मत भूलना। ओह, और System.Collections.ObjectModel. भी है। वहां से आप एमएसडीएन से वादा करने वाले किसी भी चीज़ पर अधिक जानकारी प्राप्त करने में सक्षम होना चाहिए।

0

ये विभिन्न प्रकार के general data structures के उदाहरण हैं। इन डेटा संरचनाओं का उपयोग सॉफ्टवेयर इंजीनियरिंग में पूरे स्थान पर किया जाता है।

2

सूची < टी > क्रमबद्ध है, लेकिन सार्वजनिक रूप से उजागर होने की अनुशंसा नहीं की जाती है।

संग्रह < टी > एक बुनियादी, कोई फ्रिल्स संग्रह नहीं है।

शब्दकोश < टी > कुंजी-मूल्य जोड़े का संग्रह है (पुराने हैशटेबल की तरह, लेकिन अब सामान्य)।

KeyedCollection < टी > एक शब्दकोश जहां कुंजी मान से निर्धारित किया जा सकता है (यह, एक सार है, तो आप इसे से विरासत और GetKey समारोह का समर्थन करना चाहिए)

ReadOnlyCollection < टी > एक विशेष संग्रह है जहां सामग्री को संशोधित नहीं किया जा सकता है।

ऐरेलिस्ट और हैशटेबल मूल रूप से अप्रचलित .NET 2.0 से शुरू हो रहे हैं।

+0

क्या आपके पास अप्रचलितता का सुझाव देने वाला एक लिंक है? – Pacerier

5

हैश नक्शे

  • शब्दकोश
  • Hashtable (गैर-सामान्य)

यह एक डेटा संरचना है कि आप कुंजी-मान जोड़ों रखने के लिए अनुमति देता है। एक कुंजी को देखते हुए जिसमें आदेश देने का कोई तरीका है, आप एक मूल्य डाल सकते हैं। एक साधारण उदाहरण उन छात्रों की एक सूची हो सकती है जहां कुंजी छात्र आईडी है, और छात्र का मूल्य मूल्य है।

रैंडम एक्सेस सूचियों

  • सूची
  • ArrayList (गैर-सामान्य)

रैंडम एक्सेस सूचियों वस्तुओं है कि बेतरतीब ढंग से पहुँचा जा करने के लिए कर रहे हैं की एक लंबी सूची (स्टोर करने के लिए उपयोग किया जाता है यानी आप ओ (1) समय में n'th तत्व का उपयोग करना चाहते हैं)। यदि आप सूची के मध्य में तत्वों को सम्मिलित/हटाना चाहते हैं तो यह अच्छा नहीं है, क्योंकि उसमें पूरी सूची को घुमाने के लिए कुछ समय लग सकता है।

लिंक्ड सूचियों और समान

  • LinkedList
  • कतार
  • ढेर

लिंक्ड सूची नहीं है महान आप, बीच में तत्वों का उपयोग करने की है कि के बाद से नहीं करना चाहते हैं ओ (एन) समय लेगा। यह बहुत अच्छा है यदि आप मध्य में तत्वों को सम्मिलित/निकालना चाहते हैं क्योंकि इसमें केवल कुछ पॉइंटर्स बदलना शामिल है।

कतार और ढेर थोड़ा विशिष्ट हैं, जिसमें उन्हें फीफो और फिलो व्यवहार (प्रथम-प्रथम-प्रथम-प्रथम-प्रथम-प्रथम-क्रमशः क्रमशः) के लिए अनुकूलित किया गया है।

+0

क्या हैशैप एक प्रकार की यादृच्छिक-पहुंच सूची नहीं है? – Pacerier

6

आपको बुनियादी डेटा संरचनाओं के बारे में एक पुस्तक लेनी चाहिए। भाषा के बावजूद यह वही सिद्धांत है।

एक संक्षिप्त विवरण:

  • Array: (जैसे int[] myArray के रूप में) - स्थिर सरणी है कि जब संग्रह कभी नहीं बदलता इस्तेमाल किया जा सकता (आप जोड़ सकते हैं नहीं या उस में आइटम हटा, लेकिन आप बदल सकते हैं व्यक्तिगत वस्तुओं के मूल्य)
  • ArrayList: सामान्य उद्देश्य सरणी/सूची जो अपेक्षाकृत तेज़ गणना के साथ-साथ प्रत्यक्ष पहुंच की अनुमति देती है। जब आप आइटम जोड़ते हैं तो यह सूची स्वचालित रूप से बढ़ सकती है, लेकिन चूंकि यह केवल Object स्टोर करती है, इसलिए आपको शायद ही कभी प्रदर्शन और प्रकार-सुरक्षा समस्याओं के कारण इसका उपयोग करना चाहिए।
  • List<T>: उपरोक्त ArrayList का जेनेरिक संस्करण। यह प्रदर्शन और लचीलापन के बीच एक अच्छा संतुलन प्रदान करता है और जब आपके पास वस्तुओं की एक गतिशील फ्लैट सूची होती है तो लगभग हमेशा उपयोग किया जाना चाहिए। (.NET 2.0 में नया)
  • Hashtable: एक फ्लैट सूची की तरह काम करता है लेकिन इसे पूर्णांक के साथ अनुक्रमणित करने के बजाय, इसे किसी ऑब्जेक्ट का उपयोग करके अनुक्रमित किया जा सकता है। ध्यान देने योग्य बात यह है कि हैश तालिका में कोई "ऑर्डर" नहीं है।
  • Dictionary<T>: हैशटेबल का जेनेरिक संस्करण। ऊपर दिए गए ArrayList बनाम सूची के समान कारणों से हैशटेबल के बजाय .NET 2.0 और उच्चतर में इसका उपयोग करें।
  • Stack<T>: पहली बार सूची में अंतिम-आउट प्रकार प्रदान करता है। आपके द्वारा आखिरी बार जोड़ा गया आइटम वह आइटम होगा जब आप कुछ चुनते हैं।
  • Queue<T>: पहली बार पहली सूची में प्रदान करता है। इसे एक ट्यूब के रूप में सोचें, जहां आप एक छोर पर आइटम डालते हैं और दूसरे छोर पर उन्हें बाहर ले जाते हैं। आम तौर पर उदाहरण के बीच संदेश पास करने के लिए प्रयोग किया जाता है धागे।

सामान्य रूप से, आपको .NET 2.0 और उच्चतर में जो कुछ भी करना है, उसके लिए सामान्य संग्रह का उपयोग करना चाहिए। आपको पूर्ण प्रकार की सुरक्षा मिलेगी (उदाहरण के लिए ऐरेलिस्ट और हैशटेबल की तुलना में) और वे गैर सामान्य इकाइयों की तुलना में मूल्य प्रकार (पूर्णांक, structs, floats आदि) के लिए बहुत तेज़ हैं।

यदि आपके पास ऐसी वस्तुओं की एक सूची है जो कभी नहीं बदलेगी, या आपको List<T> की लचीलापन की आवश्यकता नहीं है, तो आप निश्चित रूप से एक सरणी का उपयोग कर सकते हैं क्योंकि इसमें कम से कम ओवरहेड है।

जब आप किसी सार्वजनिक विधि या संपत्ति से संग्रह वापस करते हैं तो एक अनुशंसा इसे कम लचीला इंटरफ़ेस में डालने के लिए होती है। इसलिए यदि आपके पास एक सूची है जो आप लौटते हैं, तो आप इसे IEnumerable<int> पर डाल सकते हैं जिसका अर्थ है कि आपका उपभोक्ता इसमें आइटम नहीं जोड़ सकता है (जब तक कि यह निश्चित रूप से इसे वापस नहीं रखता है, लेकिन यह अभी भी उपयोगकर्ताओं के लिए एक संकेत है)। एपीआई स्थिरता को बनाए रखते हुए, इसे कास्टिंग करने से आपको बाद में अंतर्निहित डेटास्ट्रक्चर को बदलने की लचीलापन भी मिल जाएगी। थोड़ा अधिक कार्यक्षमता का पर्दाफाश करने के लिए आप वास्तविक डेटा संरचना को छिपाने के लिए ICollection<int> या IList<int> भी चुन सकते हैं।

+0

यह एक अच्छी सूची है = डी बीटीडब्ल्यू आप 'सॉर्टेड लिस्ट' और 'सॉर्टेड डिक्शनरी' में जोड़ सकते हैं क्योंकि वे आम तौर पर वे हैं जो वास्तव में उलझन में हैं (जॉनस्केट के जवाब के बाद भी) – Pacerier

2

अब तक के महान उत्तरों के अलावा, C5 Generic Collection Library के माध्यम से कुछ और संग्रह उपलब्ध हैं। प्रलेखन (उनकी साइट पर भी) आपकी आवश्यकता के आधार पर उपयोग करने का निर्णय लेने में सहायता कर सकता है।

6

टॉब्सन के पहले के जवाब पर विस्तार करने के लिए, सी 5 जेनेरिक कलेक्शन लाइब्रेरी में बड़ी संख्या में, अच्छी तरह से संग्रह हैं। मैं यहाँ उनमें से कुछ का वर्णन करेंगे:

कतार/ढेर

  • CircularQueue<T>: इस वर्ग को कड़ाई से कतार और ढेर सुविधा प्रदान करता है। साथ ही, कुशल (1) स्टैक/कतार में किसी भी आइटम तक पहुंच इंडेक्सर का उपयोग कर उपलब्ध है: cq[0] (जहां 0 सबसे पुराना आइटम है, जिसे हटाया जा सकता है, आखिरकार पॉप किया जा सकता है)। System.Collections.Generic (SCG), List<T> में अपने समकक्ष के सामान, इसका एक सरणी के द्वारा समर्थित है, की गारंटी देता है:

सूचियाँ

नोट: के रूप में पंक्ति/ढेर

  • ArrayList<T>ArrayList और LinkedList भी कार्य कर सकते हैं (1) अनुक्रमण, लेकिन सबसे खराब मामले (एन) सम्मिलन। एक आइटम खोजने के लिए (एन)।
  • LinkedList<T>: इसके समकक्ष SCG.LinkedList<T> के समान। एक दोगुना से जुड़े सूची का उपयोग करना, की गारंटी देता है हे (1) प्रविष्टि है, लेकिन बुरी से बुरी हालत हे (n) अनुक्रमण (व्यवहार में, या तो सिर या सूची की पूंछ से दूरी के लिए आनुपातिक है)। एक आइटम खोजने के लिए (एन)। सॉर्टिंग एक स्थिर मर्ज सॉर्ट का उपयोग करता है।
  • HashedArrayList<T>: उपरोक्त ArrayList<T> के समान, लेकिन डुप्लिकेट की अनुमति नहीं देता है। बदले में आपको जो लाभ मिलता है वह यह है कि किसी आइटम को ढूंढने का समय और इसकी अनुक्रमणिका (1) तक कम हो जाती है।
  • HashedLinkedList<T>: उपरोक्त LinkedList<T> के समान, लेकिन डुप्लिकेट की अनुमति नहीं देता है।पहले की तरह, किसी आइटम को खोजने का समय (1) तक घटा दिया गया है, लेकिन इसकी अनुक्रमणिका को खोजने का समय (n) है।
  • WrappedArray<T>: काफी ArrayList<T> के समान है, इस एक सरणी कि C5.IList<T> लागू करता है के चारों ओर एक आवरण के रूप में कार्य है, लेकिन अपवाद फेंकता है तो एक प्रयास संग्रह (IsFixedSize सच है और Add, Remove, Insert काम नहीं करते संशोधित करने के लिए किया जाता है; Sort, Shuffle, और Reverse, हालांकि, वे इन-प्लेस ऑपरेशंस के रूप में करते हैं)।

सूचियां "व्यू" कार्यक्षमता भी प्रदान करती हैं जो अंतर्निहित सूची के एक सेगमेंट का प्रतिनिधित्व करती है, जिससे स्थानीय परिचालनों को निष्पादित किया जा सकता है। सी 5 पुस्तक में दिए गए पैटर्न का उपयोग करके, संचालन उन दृश्यों का उपयोग करके किया जा सकता है जो दोनों सरणी और लिंक्ड सूचियों पर कुशल हैं। किसी भी सूची ऑपरेशन को एक दृश्य पर भी किया जा सकता है, जो अंतर्निहित सूची के उप-समूह में अपना प्रभाव प्रतिबंधित कर सकता है।

छाँटे संग्रह

  • SortedArray<T>: को छोड़कर वह अपने आइटम हल कर रखता है और डुप्लिकेट की अनुमति नहीं है कि एक ArrayList<T> की ही तरह। ध्यान दें कि इस संग्रह पर यादृच्छिक प्रविष्टियां और हटाना धीमा है। यह संग्रह सबसे अच्छा है यदि वस्तुओं की संख्या कम या शायद ही कभी संशोधित होती है लेकिन अक्सर आइटम इंडेक्स या मूल्य द्वारा उपयोग की जाती है।
  • TreeSet<T>: वस्तुओं को क्रमबद्ध रखने के लिए एक लाल-काले पेड़ संरचना का उपयोग करता है। एक सेट के रूप में, यह डुप्लिकेट की अनुमति नहीं देता है। इंडेक्स या आइटम वैल्यू और सम्मिलन/हटाना (लॉग एन) द्वारा एक्सेस करें।
  • TreeBag<T>: वस्तुओं को क्रमबद्ध रखने के लिए एक लाल-काले पेड़ का उपयोग करता है। एक बैग के रूप में, यह डुप्लिकेट की अनुमति देता है, लेकिन पेड़ में डुप्लिकेट स्टोर नहीं करता है, बल्कि गिनती करके डुप्लीकेट रखता है।

दोनों TreeSet<T> और TreeBag<T> में क्षमता कुशलतापूर्वक "स्नैपशॉट" बनाने के लिए या पेड़ की लगातार प्रतियां प्रदान हे (1), जबकि अंतर्निहित पेड़ को संशोधित स्नैपशॉट से अधिक यात्रा की इजाजत दी। ध्यान दें कि पेड़ पर प्रत्येक स्नैपशॉट पेड़ के अपडेट के लिए प्रदर्शन जुर्माना जोड़ता है, लेकिन स्नैपशॉट का निपटारा होने पर ये प्रभाव दूर हो जाते हैं।

हैश संग्रह

  • HashSet<T>: भंडारण के लिए एक सरल हैश तालिका का उपयोग कर एक संग्रह। आइटम मान द्वारा एक्सेस (1) लेता है। एक सेट के रूप में, यह डुप्लिकेट की अनुमति नहीं देता है। एक फ़ंक्शन BucketCostDistribution() प्रदान करता है जो आपको 'हैशकोड फ़ंक्शन' की कार्यक्षमता निर्धारित करने में मदद कर सकता है।
  • HashBag<T>: HashSet<T> के समान, लेकिन बैग अर्थशास्त्र है, जिसका अर्थ है कि डुप्लिकेट की अनुमति है, लेकिन डुप्लीकेट केवल गिनती करके संग्रहीत होते हैं।

प्राथमिकता कतार

  • IntervalHeap<T>: एक प्राथमिकता कतार प्रदान करता है।अधिकतम और न्यूनतम (1) संचालन, अधिकतम, न्यूनतम, जोड़ना और अपडेट करना (लॉग एन) संचालन हैं। डुप्लिकेट को स्पष्ट रूप से संग्रहीत करके अनुमति देता है (गिनती से नहीं)।

शब्दकोश

  • HashDictionary<H,K>: SCG.Dictionary<H,K> के समान, प्रविष्टि का उपयोग, प्रविष्टि, और हे में विलोपन प्रदान करता है (1)। BucketCostDistribution() फ़ंक्शन को HashSet<T> ऊपर भी प्रदान करता है। किसी विशेष गणना आदेश की गारंटी नहीं देता है।
  • TreeDictionary<H,K>: SCG.SortedDictionary<H,K> के समान, एक लाल-काले पेड़ का उपयोग करके लगातार क्रमबद्ध शब्दकोश प्रदान करता है। प्रवेश पहुंच, सम्मिलन, और हटाना (लॉग एन) ले लो। गारंटी है कि शब्दकोश की गणना कुंजी तुलनाकर्ता द्वारा निर्दिष्ट आदेश का पालन करती है।

पहरा संग्रह

साथ ही, सी 5 भी "पहरा" संग्रह, जो प्रभावी रूप से केवल पढ़ने के लिए आवरण के रूप में कार्य करता है, संशोधित किए जाने से संग्रह को रोकने प्रदान करता है। संग्रह में आइटम अभी भी संशोधित किए जा सकते हैं, लेकिन आइटम को संग्रह में जोड़ा, हटाया या डाला नहीं जा सकता है।

एक लंबा उत्तर, लेकिन सी 5 पुस्तकालयों पर आपके निपटान में विभिन्न संग्रहों पर पूरी तरह से। मैं सी 5 पुस्तकालय महान होने के लिए मिल गया है और अक्सर अपने खुद के कोड में उपयोग, के साथ आम सी # हैडर की जगह:

using C5; 
using SCG = System.Collections.Generic; 
1

MSDN एक लेख Selecting a Collection Class कहा जाता है कि मैं बहुत उपयोगी पाते हैं जब किस तरह पता लगाने की कोशिश किसी दिए गए परिस्थिति में उपयोग करने के लिए संग्रह का।

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

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