मेरे पास किसी आइटम को संग्रह से निकालने का प्रयास करने का क्लासिक मामला है, जबकि इसे लूप में एन्यूमरेट कर रहा है:
List<int> myIntCollection = new List<int>();
myIntCollection.Add(42);
myIntCollection.Add(12);
myIntCollection.Add(96);
myIntCollection.Add(25);
foreach (int i in myIntCollection)
{
if (i == 42)
myIntCollection.Remove(96); // The error is here.
if (i == 25)
myIntCollection.Remove(42); // The error is here.
}
परिवर्तन के बाद पुनरावृत्ति की शुरुआत में, एक InvalidOperationException
फेंक दिया जाता है, क्योंकि अंतर्निहित संग्रह में परिवर्तन होने पर प्रगणक पसंद नहीं करते हैं।
मुझे पुनरावृत्ति करते हुए संग्रह में परिवर्तन करने की आवश्यकता है। कई पैटर्न हैं जिनका उपयोग इससे बचने के लिए किया जा सकता है , लेकिन उनमें से कोई भी एक अच्छा समाधान नहीं है:
इस लूप के अंदर डिलीट न करें, इसके बजाय एक अलग "डिलीट लिस्ट" रखें, जिसे आप मेन लूप के बाद प्रोसेस करते हैं।
यह आम तौर पर एक अच्छा समाधान है, लेकिन मेरे मामले में, मुझे आइटम को तुरंत "प्रतीक्षा" के रूप में जाने की आवश्यकता है, जब तक कि मुख्य लूप के बाद आइटम वास्तव में मेरे कोड के तर्क प्रवाह को बदल देता है।
आइटम को हटाने के बजाय, बस आइटम पर एक ध्वज सेट करें और इसे निष्क्रिय के रूप में चिह्नित करें। फिर सूची को साफ करने के लिए पैटर्न 1 की कार्यक्षमता जोड़ें।
यह मेरी सभी जरूरतों के लिए काम करेगा , लेकिन इसका मतलब है कि किसी आइटम के एक्सेस होने पर हर बार निष्क्रिय ध्वज की जांच करने के लिए बहुत सारे कोड को बदलना होगा। यह मेरी पसंद के लिए बहुत अधिक प्रशासन है।
किसी तरह पैटर्न 2 के विचारों को एक वर्ग में शामिल किया जाता है जो इससे उत्पन्न होता है
List<T>
। यह सुपरलिस्ट निष्क्रिय झंडे को संभाल लेगा, इस तथ्य के बाद वस्तुओं का विलोपन होगा और यह भी गणना उपभोक्ताओं के लिए निष्क्रिय के रूप में चिह्नित वस्तुओं को उजागर नहीं करेगा। मूल रूप से, यह सिर्फ पैटर्न 2 (और बाद के पैटर्न 1) के सभी विचारों को कूटबद्ध करता है।क्या इस तरह एक वर्ग मौजूद है? क्या किसी के पास इसके लिए कोड है? या कोई बेहतर तरीका है?
मुझे बताया गया है कि पहुँच के
myIntCollection.ToArray()
बजायmyIntCollection
समस्या का समाधान होगा और मुझे लूप के अंदर हटाने की अनुमति देगा।यह मेरे लिए एक खराब डिजाइन पैटर्न की तरह लगता है, या शायद यह ठीक है?
विवरण:
सूची में कई आइटम होंगे और मैं उनमें से कुछ को ही हटाऊंगा।
लूप के अंदर, मैं सभी प्रकार की प्रक्रियाएं कर रहा हूं, जोड़ना, निकालना आदि, इसलिए समाधान को काफी सामान्य होने की आवश्यकता है।
जिस आइटम को मुझे हटाने की आवश्यकता है वह लूप में वर्तमान आइटम नहीं हो सकता है। उदाहरण के लिए, मैं 30 आइटम लूप के आइटम 10 पर हो सकता हूं और आइटम 6 या आइटम 26 को हटाने की आवश्यकता हो सकती है। सरणी के माध्यम से पीछे की ओर चलना अब इस वजह से काम नहीं करेगा। ; ओ (