2010-04-07 10 views
9

फेंक मैं एक विशेष विधि है कि कभी-कभी एक ArgumentException साथ दुर्घटनाग्रस्त है:सूची <> AddRange ArgumentException

Destination array was not long enough. Check destIndex and length, and the array's lower bounds.: 
at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable) 
at System.Collections.Generic.List`1.CopyTo(T[] array, Int32 arrayIndex) 
at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection) 
at System.Collections.Generic.List`1.AddRange(IEnumerable`1 collection) 

कोड है कि इस दुर्घटना का कारण है इस तरह दिखता है:

List<MyType> objects = new List<MyType>(100); 
objects = FindObjects(someParam); 
objects.AddRange(FindObjects(someOtherParam); 

के अनुसार एमएसडीएन, सूची <> .ddRange() को स्वचालित रूप से आवश्यक रूप से आकार बदलना चाहिए:

यदि नई गणना (वर्तमान गणना प्लस आकार का आकार) क्षमता से अधिक होगी, सूची < की क्षमता (< (टी>)>) को नए तत्वों को समायोजित करने के लिए आंतरिक सरणी को स्वचालित रूप से पुन: आवंटित करके बढ़ाया जाता है , और नए तत्व जोड़े जाने से पहले मौजूदा तत्वों को नई सरणी में कॉपी किया गया है।

क्या कोई ऐसी परिस्थिति के बारे में सोच सकता है जिसमें AddRange इस प्रकार के अपवाद को फेंक सकता है?


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

FindObjects के बारे में सवाल के जवाब() विधि में।

List<MyObject> retObjs = new List<MyObject>(); 

foreach(MyObject obj in objectList) 
{ 
    if(someCondition) 
     retObj.Add(obj); 
} 
+1

'FindObjects' वापस क्या करता है? साथ ही, आप 'ऑब्जेक्ट्स' क्यों शुरू करते हैं और फिर इसे अगली पंक्ति पर तुरंत पुनः निर्दिष्ट करें? –

+0

जब आप कोई आइटम जोड़ते हैं, तो यह जांचता है कि आकार पर्याप्त बड़ा है, अगर यह आंतरिक सरणी का उपयोग नहीं करता है। हालांकि कई धागे का उपयोग करते समय, कोई भी जांच सकता है, झूठा हो सकता है और सरणी का आकार बदल सकता है, अगला थ्रेड पढ़ता है कि पर्याप्त जगह है और आकार बदलता नहीं है, तो वे दोनों वास्तविक 'this._items [this._size ++] = आइटम तक पहुंचते हैं ; एक ही समय में कोड ... बाद वाला धागा उड़ाता है। जब जॉन कहता है कि 'सूची ' नीचे दिए गए उत्तर में धागा सुरक्षित नहीं है, तो यह 'सूची ' की बातों में से एक है। –

+0

मैंने कोड नहीं लिखा, मैं बस इस मुद्दे को डीबग कर रहा हूं। बहुत सारे अजीब चीजें हैं जो रखरखाव करते हैं जब आसपास घूमते हैं :) – Tim

उत्तर

20

आप एक से अधिक थ्रेड से ही सूची को अद्यतन करने के प्रयास कर रहे हैं: यह मूल रूप से इस तरह दिखता है? इससे समस्याएं पैदा हो सकती हैं ... List<T> एकाधिक लेखकों के लिए सुरक्षित नहीं है।

+0

FindObjects() विधि स्वयं एक नई सूची <> ऑब्जेक्ट को तुरंत चालू करती है, इसे पॉप्युलेट करती है और इसे वापस कर देती है। वे सभी सिंगल थ्रेडेड हैं, इसलिए मुझे नहीं लगता कि सूची में कई धागे काम करने की संभावना है। – Tim

+0

@ टिम: फिर मैं नहीं देख सकता कि ऐसा क्यों होगा। देखें कि क्या आप एक संक्षिप्त लेकिन पूर्ण कार्यक्रम के साथ आ सकते हैं जो समस्या का प्रदर्शन करता है। अगर हम इसे पुन: पेश कर सकते हैं, तो हम इसे ठीक करने में सक्षम होना चाहिए। –

+0

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

0

ईमानदारी से, मुझे यकीन नहीं है, लेकिन क्यों न केवल अपनी सूची प्रारंभिकरण पर आकार घोषणा को हटा दें?

List`<MyType>` list = new List`<MyType>` 
+3

क्योंकि प्रारंभिकरण को तत्काल त्याग दिया जाता है। इस तरह से शुरू करने के लिए * * की आवश्यकता भी नहीं है। –

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