2010-04-28 8 views
5

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

हिस्सा इस तरह दिखता है:

foreach(MyClass cItem in checkedListBoxItemList.Items) 
{ 
    foreach(MyClass cActiveItem in ActiveItemList) 
    { 
     if (cActiveItem.ID == cItem.ID) /*...check checkbox for item...*/; 
    } 
} 

कहना चलें, checkedListBoxItemList.items प्रकार MyClass की 4 आइटम रखती है, और ActiveItemList एक सूची < MyClass> 2 आइटम के साथ है।

डिबगर बाहरी foreach में कूदता, भीतरी foreach तक पहुँच जाता है, कार्यान्वित (एक बार cActiveItem प्रति) यदि 2 बार और बाहरी foreach.Now के अंत तक पहुँच जाता है, डिबगर यह रूप में बाहरी foreach के सिर को वापस कूदता ऐसा करना चाहिए। लेकिन बाहरी foreach के दूसरे दौर शुरू करने के बजाय, डीबगर अचानक MyClass.ToString() विधि में कूदता है। मैं 4 बार इस विधि के माध्यम से कदम उठा सकता हूं (चेकलिस्ट BoxItemList.Items में आइटम की संख्या) और फिर ... कुछ भी नहीं। विजुअल स्टूडियो मुझे मेरे विंडोज़ फॉर्म दिखाता है, और foreach जारी नहीं है।

जब करने के लिए

int ListCount = checkedListBoxItemList.Items.Count; 
for(int i=0; i<ListCount; i++) 
{ 
    MyClass cItem = checkedListBoxItemList.Items[i] as MyClass; 
    foreach(MyClass cActiveItem in ActiveItemList) 
    { 
     if (cActiveItem.ID == cItem.ID) /*...check checkbox for item...*/; 
    } 
} 

सब कुछ कोड बदल रहा है ठीक काम करता है और माना जाता है। मैंने समस्या को एक कॉलेग्यू में दिखाया, लेकिन वह भी समझ में नहीं आया, क्या हुआ। मैं समझ नहीं पा रहा हूं कि क्यों डीबगर MyClass.ToString() विधि में कूदता है। मैंने एफ 10 का उपयोग करने के लिए कदम रखा, इसलिए फ़ंक्शन को छोड़ने की कोई आवश्यकता नहीं है। और यहां तक ​​कि यदि कोई कारण है, तो फोरैच लूप क्यों जारी नहीं है?

मैं विजुअल स्टूडियो 2010 का उपयोग कर रहा हूं, अगर यह किसी भी मामले में है।

कृपया मुझे बताएं कि क्या हुआ। धन्यवाद।

+1

'checkListBoxItemList' का प्रकार क्या है? मेरा मानना ​​है कि इसे 'foreach' के साथ उपयोग करने के लिए' IENumerable' को लागू करना है, और मुझे नहीं पता कि आपने कहां बताया था कि यह किस प्रकार का था। –

+0

जाहिर है चेकलिस्टबॉक्स ItemList चेकलिस्ट लिस्टबॉक्स का प्रकार है। लेकिन मैं ListBox पर पुन: प्रयास नहीं कर रहा हूं, लेकिन चेकलिस्टबॉक्स ItemList.Items पर। यह चेकडइटम कॉलेक्शन प्रकार है और आईनेमरेबल लागू करता है। – Marks

उत्तर

7

जब संग्रह को पुन: सक्रिय करते हैं (एक foreach का उपयोग करके), संग्रह जिसे आप पुनरावृत्त कर रहे हैं उसे बदलने की अनुमति नहीं है; लेकिन जब आप मिलान करने वाले आइटम के लिए चेकबॉक्स चेक करते हैं, तो बाहरी लूप (checkedListBoxItemList.Items) का संग्रह बदल जाता है और फेंकने वाली परिणामी त्रुटि शायद कहीं निगल जाती है। यह कम या ज्यादा बताता है कि आप अचानक ToString विधि में क्यों जाते हैं और लूप जारी नहीं रखते हैं।

जब आप for स्टेटमेंट को फिर से उपयोग करते हैं, तो आपके पास उस प्रतिबंध पर नहीं है क्योंकि आपके द्वारा पुनरारंभ करने के पल में संग्रह का कोई संदर्भ नहीं है।

आशा है कि यह बताता है।

+0

धन्यवाद। मुझे पता था कि मैं पुनरावृत्त संग्रह नहीं बदल सकता। लेकिन चूंकि .इम्स मेरी माई क्लास ऑब्जेक्ट्स का संग्रह है, और चेक किए गए राज्य को नहीं रखता है, मैंने सोचा कि यह ठीक होगा। संकलक नोटिस समस्या नहीं है? मुझे संकलक त्रुटियों को याद है जो मुझे अतीत में पुनरावृत्ति वस्तुओं को नहीं बदलने के लिए कह रहा है। डीबगर मुझे ToString विधि में क्यों ले जा रहा है इस पर कोई सुराग? मैं इसके लिए कोई कारण नहीं देखता क्योंकि मैंने एफ 10 (चरणबद्ध) का उपयोग किया था। – Marks

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