2010-06-29 3 views
5

में शब्दकोश से आइटम को हटा रहा है मेरे पास यह सब ठीक है और यह सुनिश्चित नहीं है कि क्यों और यदि यह मान्य है।सी # - लूप

 Dictionary<string, List<string>> test = new Dictionary<string, List<string>>(); 

     while (test.Count > 0) 
     { 
      var obj = test.Last(); 
      MyMethod(obj); 
      test.Remove(obj.Key); 
     } 

अद्यतन: जवाब के लिए धन्यवाद, मैं अपने कोड को अद्यतन किया है समझाने के लिए कारण है कि मैं Dictionary.Clear() नहीं करते;

उत्तर

10

इस तरह से थोड़ी देर में एक संग्रह प्रकार को बदलने में कुछ भी गलत नहीं है। जब आप foreach ब्लॉक के दौरान संग्रह को म्यूट करते हैं तो आप परेशानी में पड़ते हैं। या अंतर्निहित संग्रह उत्परिवर्तित होने के बाद आमतौर पर IEnumerator<T> का उपयोग करें।

हालांकि इस नमूने में यह होगा बहुत आसान सिर्फ कॉल करने के लिए test.Clear() :)

1

काम करता है यही कारण है कि, ठीक है, जब से तुम शब्दकोश से अधिक पुनरावृत्ति नहीं कर रहे हैं, जबकि आइटम निकालने के। प्रत्येक बार जब आप परीक्षण की जांच करते हैं। गणना करें, ऐसा लगता है कि यह इसे स्क्रैच से जांच रहा है।

कहा जा रहा है, इसके बाद के संस्करण कोड बहुत सरल और अधिक प्रभावी ढंग से लिखा जा सकता है:

test.Clear(); 
1

यह काम करता है क्योंकि गणना हर बार जब आप एक वस्तु को दूर अद्यतन किया जाएगा। तो गणना करें कि गिनती 3 है, परीक्षण। रिमू गिनती को 2 तक सीमित कर देगा, और इसी तरह, जब तक कि गिनती 0 न हो, तो आप लूप

0

हां, यह वैध होना चाहिए, लेकिन क्यों न सिर्फ कॉल करें Dictionary.Clear()?

0

आप जो भी कर रहे हैं वह संग्रह में अंतिम आइटम ले रहा है और इसे तब तक हटा रहा है जब तक शब्दकोश में कोई और आइटम शेष नहीं है।

साधारण से बाहर कुछ भी नहीं है और कोई कारण नहीं है कि यह काम नहीं करना चाहिए (जब तक संग्रह खाली क्या आप क्या करना चाहते है) है।

0

तो, आप बस शब्दकोश को साफ़ करने की कोशिश कर रहे हैं, सही? क्या आप बस निम्नलिखित नहीं कर सके?

Dictionary<string, List<string>> test = new Dictionary<string, List<string>>(); 
     test.Clear(); 
0

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

Dictionary.Clear() चाल करना चाहिए (लेकिन आप शायद पहले से ही पता था कि)।

0
अपने अद्यतन बावजूद

, तो आप शायद अभी भी स्पष्ट उपयोग कर सकते हैं ...

foreach(var item in test) { 
    MyMethod(item); 
} 
test.Clear() 

.Last (करने के लिए आपका कॉल) एक बड़े शब्दकोश पर बेहद अक्षम होने जा रहा है, और किसी विशेष आदेश की गारंटी नहीं है प्रसंस्करण परवाह किए बिना की

8

मुझे समझ नहीं आता कि क्यों उलटे क्रम में सभी Dictonary प्रविष्टियों संसाधित करने का प्रयास कर रहे हैं (शब्दकोश एक अव्यवस्थित संग्रह है) - लेकिन अपने कोड ठीक है।

यह थोड़ा तेजी से सभी कुंजी की एक सूची प्राप्त है और इसके बजाय बार-बार गिनती के प्रमुख द्वारा प्रविष्टियों को संसाधित करने में हो सकती है ...

E.G.:

var keys = test.Keys.OrderByDescending(o => o).ToList(); 

foreach (var key in keys) 
{ 
    var obj = test[key]; 
    MyMethod(obj); 
    test.Remove(key); 
} 

डिक्टोनरी तेजी से होते हैं जब उन्हें उनके मुख्य मूल्य से एक्सेस किया जाता है। अंतिम() धीमा है और गिनती आवश्यक नहीं है - आप सभी (अद्वितीय) कुंजी की एक सूची प्राप्त कर सकते हैं।