2012-01-04 9 views
6

हम निम्न चर घोषणा है:निर्माण पर पर्याप्त आकार प्रदान किए जाने पर सूची सम्मिलन विफल क्यों होता है?

list.insert(2, 3); 

निम्न त्रुटि के साथ विफल:

Index must be within the bounds of the List. 

प्रारंभिक आकार प्रदान करने का फ़ायदा क्या है

List<int> list = new List(5); 

क्यों करता है?

+4

आप स्थिति 2 में सम्मिलित नहीं कर सकते, अगर पदों 0 और 1 अभी तक –

+0

भरा नहीं कर रहे हैं के रूप में सही ढंग से बताया, क्षमता नहीं आकार के समान ही है । सम्मिलित करने से पहले कंसोल पर गणना लिखें, सूची में 3 आइटम कम हैं, इसलिए तीसरी स्थिति में नया मान डालना विफल रहता है। –

उत्तर

8

सभी प्रारंभिक आकार provide a hint to the implementation to have at least a given capacity है। यह N डिफ़ॉल्ट प्रविष्टियों से भरा एक सूची नहीं बनाता है; जोर मेरा:

Initializes a new instance of the List<T> class that is empty and has the specified initial capacity.

आप टिप्पणी अनुभाग के लिए MSDN प्रविष्टि के माध्यम से जारी रखने के लिए हैं, तो आप यह क्यों निर्माता अधिभार प्रदान की जाती है मिल जाएगा (फिर से, जोर मेरा):

The capacity of a List<T> is the number of elements that the List<T> can hold. As elements are added to a List<T> , the capacity is automatically increased as required by reallocating the internal array.

If the size of the collection can be estimated, specifying the initial capacity eliminates the need to perform a number of resizing operations while adding elements to the List<T> .

कम List<T>.Count में है List<T>.Capacity के समान नहीं ("यदि तत्व जोड़ते समय क्षमता गणना से अधिक है, तो क्षमता बढ़ जाती है ...")।

आप क्योंकि इस सूची में केवल तार्किक आइटम आप जोड़ सकते हैं, शामिल हैं क्षमता को बदलने आइटम तार्किक संग्रहीत की संख्या में परिवर्तन नहीं होता अपवाद प्राप्त करते हैं।

Unhandled Exception: System.ArgumentOutOfRangeException: capacity was less than 
the current size. 
Parameter name: value 
    at System.Collections.Generic.List`1.set_Capacity(Int32 value) 

शायद व्यवहार आप देख रहे हैं बनाने के लिए::

public static List<T> CreateDefaultList<T>(int entries) 
{ 
    return new List<T>(new T[entries]); 
} 
+0

फिर प्रारंभिक बैकिंग स्टोर नहीं बनाने के लिए यह संकेत क्या उपयोग करता है? – Erix

+0

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

+0

इसका मतलब यह है कि सूची वस्तु बढ़ने से पहले इसे 5 आइटम प्राप्त हो सकते हैं। यह एक प्रदर्शन अनुकूलन है। – Tormod

0

क्योंकि डालने मानता है कि आप कम से कम List<T>.Count को List<T>.Capacity स्थापित करने के लिए थे, तो हम दूसरी दिशा जा रहा इस व्यवहार परीक्षण कर सकते हैं सूची में वास्तव में यह है कि पहले से ही कई आइटम डाले गए हैं- क्षमता आकार के समान नहीं है। किसी दिए गए क्षमता के साथ सूची को आरंभ करने से केवल आंतरिक सरणी का आकार सेट होता है- जब आप उन वस्तुओं की संख्या को जानते हैं जिन्हें आप डालने जा रहे हैं, तो सरणी का आकार बदलने के लिए यह एक अनुकूलन है।

0

सूची (int) निर्माता सूची की आरंभिक क्षमता निर्दिष्ट करता है। यह प्रारंभिक तत्वों की संख्या निर्दिष्ट नहीं करता है। निर्माण पर एक सूची खाली है, इसलिए कोई प्रविष्टि केवल इंडेक्स 0 पर किया जा सकता है।

2

कन्स्ट्रक्टर में आकार यह बताता है कि पृष्ठभूमि सरणी के लिए कितना आवंटित करना है - यह अभी भी खाली है (बस: खाली प्रारंभिक स्थान की एक निश्चित राशि)।

आप सूची के उपयोग किए गए हिस्से में या अंत में डालने पर क्लिक कर सकते हैं।

2

आंतरिक रूप से List(T) पृष्ठभूमि में एक सरणी का उपयोग करके लागू किया गया है। जब आप सूची को प्रारंभ करते हैं तो आप केवल अंतर्निहित सरणी का आकार निर्धारित कर रहे हैं जो सूची बढ़ने के बाद बदलता है। इस प्रकार, आप प्रारंभिक क्षमता शुरू कर रहे हैं। इसका मतलब यह नहीं है कि आपकी सूची में कई तत्व हैं।

आप पहले इसे प्रारंभ करके सूची में तत्व जोड़ते हैं और फिर .Add(item) के साथ तत्व जोड़ते हैं।

0

आरंभिक आकार का उपयोग प्रारंभिक रूप से आंतरिक सरणी के आकार को इंगित करने के लिए किया जाता है।

जब आप किसी सूची में आइटम डालते हैं, तो यह उन्हें एक सरणी में संग्रहीत करता है। जब सरणी भर जाती है, तो यह आकार के दोगुने की एक नई सरणी बनाती है, और सभी वस्तुओं की प्रतिलिपि बनाता है। यदि आपके पास कोई विचार है कि आप 5000 आइटम डालने जा रहे हैं, तो आप उस संकेत को निर्दिष्ट करना चाहते हैं, इसलिए यह बहुत सारे सरणी आकार बदलने/प्रतिलिपि करने में समाप्त नहीं होता है।

प्रारंभिक आकार इंगित करता है कि सूची में कोई आइटम हैं।

0

ऐसा इसलिए है क्योंकि आपके द्वारा कन्स्ट्रक्टर में निर्दिष्ट पूर्णांक वह राशि है जो सूची हो सकती है। जब आइटम जोड़े जाते हैं, तो सूची स्वचालित रूप से बढ़ जाती है। आकार बदलने से बचा जाता है जब आप प्रारंभिक क्षमता निर्दिष्ट करते हैं जो उन आइटम्स की संख्या से मेल खाता है जिन्हें आप जोड़ना चाहते हैं।

हालांकि, आपको अभी भी नई वस्तुओं को जोड़ने के लिए जोड़ें विधि का उपयोग करना होगा।

remarks section in the documentation

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