2011-08-23 14 views
6

मैं एक शब्दकोश है:शब्दकोश वस्तुओं को फिर से शुरू करते समय मूल्यों को कैसे अपडेट करें?

Dictionary<string, long> Reps = new Dictionary<string, long>(); 

और मैं जबकि इस तरह, सभी आइटम के माध्यम से पुनरावृत्ति मूल्यों को अपडेट करना चाहते:

"Collection was modified; enumeration operation may not execute" 
:

foreach (string key in Reps.keys) 
{ 
    Reps[key] = 0; 
} 

यह मुझे कह रही है एक त्रुटि दे रहा है

कोई मुझे बता सकता है कि यह मुझे यह त्रुटि क्यों दे रहा है, क्योंकि मेरे पास एक और फ़ंक्शन है जो मान जोड़ता है, और जब बटन क्लिक किया जाता है तो इसे कॉल किया जाता है:

public static void Increment(string RepId, int amount) 
{ 
    long _value = Convert.ToInt64(Reps[RepId]); 
    _value = _value + amount; 
    Reps[RepId] = _value; 
} 

और यह कार्य ठीक काम कर रहा है। तो सभी मूल्यों को अद्यतन करते समय समस्या क्या है? और इसके लिए समाधान क्या है?

उत्तर

4

अधिक सरलीकृत, ऐसा करते हैं:

foreach (string key in Reps.keys.ToList()) 
{ 
    Reps[key] = 0; 
} 

और त्रुटि के लिए कारण आप वास्तविक वस्तु जो प्रयोग में है संपादित करने के लिए कोशिश कर रहे हैं और यदि आप इसे की एक प्रतिलिपि बनाने और उसके बाद इस तरह इसका इस्तेमाल है :

var repscopy = Reps; 
foreach (string key in repscopy.keys) 
    { 
     Reps[key] = 0; 
    } 

यह एक ही त्रुटि के रूप में यह भी मूल वस्तु की ओर इशारा करते दे देंगे, और जब ToList() जोड़ा जाता है यह सूची की एक नई वस्तु बनाया

4

समस्या मूल्यों को अद्यतन नहीं कर रही है, तो आप केवल उस संग्रह को नहीं बदल सकते हैं जो आपके foreach() पर आधारित है जब foreach को पुनरावृत्त किया जा रहा है। इस

List<string> keylist = Reps.keys.ToList(); 
foreach(string r in keylist) 
{ 
Reps[r] = 0; 
} 

तरह

कोशिश somehting इस काम करेगा।

+1

अपने wokring लेकिन आप केवल एक जवाब दे दिया है मेरी तलाश का हिस्सा यानी समाधान ... क्या आप त्रुटि के कारण के बारे में और बता सकते हैं? –

+1

ठीक है, मुझे लगता है क्योंकि foreach संग्रह पर आधारित है, और यदि आप संग्रह को बदल देंगे, तो भविष्यवाणी कैसे निर्धारित कर सकती है कि कौन से हिस्सों को संसाधित करने के लिए छोड़ा गया है और क्या नहीं? जैसे यदि आप पुनरावृत्ति के दौरान एक नया रेप्स [x] जोड़ देंगे तो क्या आप उम्मीद करेंगे कि यह पूर्वानुमान में भाग लेगा या नहीं? – Pleun

3

ऐसा इसलिए होता है क्योंकि आप Dictionary<string, long> में तत्व बदल रहे हैं जबकि foreach के साथ इसे लूप करते समय। इसे इस्तेमाल करे।

foreach (string key in Reps.Keys.ToList()) 
{ 
    Reps[key] = 0; 
} 

अब आप शब्दकोश कुंजी से बनाई गई सूची में लूप कर रहे हैं। चूंकि यह मूल संग्रह नहीं है जो संशोधित है, त्रुटि दूर हो जाएगी।