आप एक Hashtable के बजाय एक शब्दकोश का उपयोग कर रहे हैं, तो इतना है कि कुंजी के प्रकार में जाना जाता है, सबसे आसान तरीका यह अपवाद से बचने के लिए कुंजी संग्रह की एक प्रतिलिपि बनाने के लिए है:
foreach (string key in new List<string>(dictionary.Keys))
आपको अपवाद क्यों मिल रहा है कि आपने उस संग्रह को संशोधित किया है जिस पर आप पुनरावृत्ति कर रहे हैं, वास्तव में जब आपने नहीं किया है?
आंतरिक रूप से, हैशटेबल वर्ग में संस्करण फ़ील्ड है। जोड़ें, सम्मिलित करें, और निकालें विधियों को इस संस्करण में वृद्धि। जब आप हैशटेबल के किसी भी संग्रह पर एक गणनाकर्ता बनाते हैं, तो गणनाकर्ता ऑब्जेक्ट में हैशटेबल का वर्तमान संस्करण शामिल होता है। गणनाकर्ता की MoveNext विधि हैशटेबल के विरुद्ध गणक के संस्करण की जांच करती है, और यदि वे बराबर नहीं हैं, तो यह आपके द्वारा देखे जा रहे अमान्यऑपरेशन अपवाद को फेंकता है।
यह निर्धारित करने के लिए है कि हैशटेबल को संशोधित किया गया है या नहीं, यह एक बहुत ही सरल तंत्र है। वास्तव में यह थोड़ा बहुत आसान है। कुंजी संग्रह को वास्तव में अपने संस्करण को बनाए रखना चाहिए, और इसकी GetEnumerator विधि को संग्रह के संस्करण को गणनाकर्ता को सहेजना चाहिए, हैशटेबल के संस्करण नहीं।
इस दृष्टिकोण में एक और, subtler डिजाइन दोष है। संस्करण एक इंट 32 है। UpdateVersion विधि कोई सीमा जांच नहीं करता है। इसलिए यह संभव है, यदि आप हैशटेबल के संस्करण के लिए हैशटेबल (2 बार Int32.MaxValue
, दे या ले लें) में संशोधन की सही संख्या बनाते हैं, तो गणना करने के बाद से आप मूल रूप से हैशटेबल को बदल चुके हैं गणक तो MoveNext विधि अपवाद को फेंक नहीं देगा, भले ही इसे चाहिए, और आपको अप्रत्याशित परिणाम मिलेंगे।
स्रोत
2008-11-29 04:23:50
मानते हैं कि यह एक dup प्रश्न देखें है कि: http://stackoverflow.com/questions/287195/how-to-add-items-to-a-collection जबकि-उपभोग करने वाला यह –