2012-08-04 4 views
5

क्या इसे आंतरिक रूप से एरे के रूप में माना जाता है या क्या इसे सीएलआर द्वारा पूरी तरह से अलग प्रकार के रूप में माना जाता है?सूची <T> आंतरिक रूप से मैप की गई सूची कैसे है?

मैं सूची में पूर्णांक मान लागू करने की कोशिश कर रहा हूं।

List<int> lst = new List<int>(); 
lst.Add(3); 
lst.Add(4); 

बनाम

मैं पूर्णांकों

int[] arr = new int[2]; 
arr[0] = 3; 
arr[1] = 4; 

सरणी रिटर्न बेहतर समय अवधि परिणामों के एक सरणी पैदा करते हैं। तो लोग सूची <> क्यों पसंद करते हैं।

+2

आप [ILSpy] (http://ilspy.net) को आजमा सकते हैं और स्वयं को देख सकते हैं। गतिशील रूप से बढ़ने योग्य/संक्रमणीय सूची होने का कारण यह है कि यह 'ऐरे' जैसी निश्चित आकार नहीं है। –

उत्तर

5

List<> डेटा संरचना का कार्यान्वयन है, जो ऑन-डिमांड आधार पर स्मृति आवंटित करने का ख्याल रखता है; यह किसी भी इंडेक्स आदि में सम्मिलन और हटाने के लिए अनुमति देता है इसलिए यह एक साधारण सरणी से कहीं अधिक सुविधाजनक है।

हुड के तहत, वर्तमान List<> कार्यान्वयन भंडारण के लिए एक सरणी का उपयोग करता है, और ओवरहेड सरणी जैसे ऑपरेशन करते समय न्यूनतम होता है। अतिरिक्त सुविधा आमतौर पर छोटे (यदि सभी प्रासंगिक हैं) प्रदर्शन अंतर के लायक है। आइटम जोड़ना आम तौर पर तेज़ होता है क्योंकि सूची मेमोरी के हिस्सों को आवंटित करती है और प्रत्येक आवंटन (शुद्ध सरणी की तुलना में, जहां Length हमेशा स्मृति में आकार के लिए बाध्य होती है) पर एक नया आवंटन और प्रतिलिपि की आवश्यकता नहीं होती है।

+0

तो, आप जो कह रहे हैं वह है, हालांकि नगण्य, 'सूची <>' एक 'ऐरे' की तुलना में _Speed_ के संदर्भ में धीमी प्रतिक्रिया प्रदान करेगी? –

+2

बेशक। सूची सरणी पर एक अमूर्त है, और abstractions अतिरिक्त CPU चक्र लागत। Howevrr, मैं सामान्य परिस्थितियों में, लुसेरो से सहमत हूं, सूची पर्याप्त तेज़ से अधिक है। – Steven

+2

"प्रतिक्रिया समय" आमतौर पर अप्रासंगिक है, अनुरोध (तेज और सस्ती) सीमा जांच के बाद अंतर्निहित सरणी के माध्यम से पारित हो जाता है। यह शायद रनटाइम द्वारा भी रेखांकित किया गया है, ताकि इसे अतिरिक्त कॉल की भी आवश्यकता न हो। – Lucero

1

एक सामान्य यादृच्छिक अभिगम सूची में आम तौर पर एक आंतरिक सरणी होती है। .NET List<T> कार्यान्वयन यह करता है। अन्य कार्यान्वयन जैसे कि LinkedList<T> सरणी के बजाय संदर्भों के साथ तत्वों की श्रृंखला का उपयोग करता है। अधिक विदेशी सूचियां ऑर्डर करने के लिए आंतरिक रूप से पेड़ों का उपयोग कर सकती हैं।

List<T> में आंतरिक सरणी को एक छोटी लंबाई (4 मुझे विश्वास है) के साथ शुरू किया गया है, और यदि आप सरणी की अधिकतम सीमाओं को बाहर जोड़ने का प्रयास करते हैं, तो यह विस्तारित होता है। चूंकि यह समय लेने वाला हो सकता है (सरणी को प्रतिलिपि बनाने की आवश्यकता है), सरणी आकार में दोगुनी हो जाती है, यानी जब आप 5 वें तत्व जोड़ते हैं तो आंतरिक सरणी लंबाई 8 और इतनी पर बदल जाती है।

+0

मुझे पढ़ना याद है, 'सूची <> 'डेटा संरचना _Speed_ के लिए अनुकूलित है, जबकि' Array' DS को _Memory_ के लिए अनुकूलित किया गया है। आप इस तथ्य का खंडन कर रहे हैं कि 'सूची <> '_Speed_ के लिए अनुकूलित है। (जब हम कहते हैं कि सीमाओं से बाहर निकलने पर यह फिर से आकार और पुन: आवंटित हो जाता है) –

+0

मैं उस भेद से सहमत नहीं हूं। एक सूची आंतरिक रूप से एक सरणी है, इसलिए अनिवार्य रूप से सरणी भंडारण-वार से अलग नहीं है। आप सूची के साथ एक छोटे से प्रदर्शन दंड का भुगतान करते हैं, और उस लागत के लिए आपको एक गतिशील/आकार बदलने योग्य संग्रह मिलता है। तो निष्कर्ष में सूची और सरणी के बीच सबसे बड़ा अंतर यह है कि आप हमेशा एक सूची में चीजें जोड़ सकते हैं। –

+1

@bugbuster, अगर आप किसी सरणी में कोई आइटम जोड़ना चाहते हैं (ताकि 'लंबाई' बढ़ जाती है, यानी न केवल * एक मौजूदा आइटम * बदलती है), आपको सरणी को फिर से आवंटित करना होगा। सूची बड़े हिस्सों में बढ़ेगी और सरणी के प्रयुक्त तत्वों की संख्या का ट्रैक रखेगी, जिससे अनुक्रमिक जोड़ों के लिए यह तेज़ होगा। – Lucero

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