सबसे पहले: शब्दावली। यदि आप "कचरा सूची" कहते हैं, तो लोग सोचेंगे कि आप कचरा संग्रहकर्ता के बारे में बात कर रहे हैं। चलो इसे "मृत सूची" कहते हैं।
जैसा कि आपने शायद खोज लिया है, इसलिए आपका प्रश्न, आप किसी संग्रह से आइटम नहीं निकाल सकते हैं जब आप इसके माध्यम से पुनरावृत्ति कर रहे हैं। यदि आपका संग्रह List<>
आइटम निकालने का सबसे सरल तरीका है, तो यह है:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
ध्यान दें कि आप पीछे की ओर पुनरावृति करते हैं । आगे पुनरावृति करते समय आप आइटम निकाल सकते हैं, लेकिन यह गड़बड़ है और इसके लिए आवश्यकता है goto
। आप इसके साथ नहीं कर सकते foreach
।
आप या तो अपने अपडेट लूप से अलग से निष्कासन कर सकते हैं। या आप इसे अपने अपडेट लूप में मर्ज कर सकते हैं। हमेशा RemoveAt
लूप के अंत में करें - लूप में उस बिंदु के बाद, list[i]
इसे वैध नहीं माना जा सकता है (यह अगले पुनरावृत्ति पर फिर से वैध हो जाता है)।
ध्यान दें, यह भी कि प्रत्येक वस्तु का अपना एक IsDead
ध्वज होता है (यदि आप निपटान पैटर्न का उपयोग कर रहे हैं, तो आप इसे बना सकते हैं IsDisposed
) - आपको वास्तव में "मृत सूची" को बनाए रखने की आवश्यकता नहीं है।
प्रत्येक आइटम पर एक ध्वज का उपयोग करना प्रदर्शन के लिए बेहतर है, क्योंकि आप हटाने के लिए सूची के माध्यम से खोज करने से बचते हैं। और यह डिजाइन के लिए भी बेहतर है - इसका मतलब है कि प्रत्येक वस्तु आसानी से जांच सकती है कि क्या यह मर चुका है - इसलिए आप गलती से इस पर कोई भी तरीका नहीं कहते हैं (यदि ये ऑब्जेक्ट डिस्पोजेबल पैटर्न को लागू कर रहे हैं, तो वे ObjectDisposedException
इस मामले में फेंक सकते हैं )।
यदि आपके पास एक के अलावा अन्य संग्रह है List<>
, तो उस संग्रह से मृत वस्तुओं को हटाने से अभी भी एक मृत सूची का निर्माण शामिल हो सकता है (जैसा कि पुनरावृत्ति के दौरान हटाना संभव नहीं हो सकता है)। मेरी राय में, यह अच्छा है, डिजाइन-वार, मृत सूची बनाने से पहले इसे उपयोग करने से पहले, IsDead
झंडे की तलाश में संग्रह पर पुनरावृत्ति करके , बल्कि सूची को बनाए रखने की कोशिश कर के रूप में वस्तुओं को मार दिया जाता है।
एक बार जब आप एक मृत सूची के साथ समाप्त हो जाते हैं, तो आपको Clear()
इसे करना चाहिए , और फिर बाद में इसे फिर से उपयोग करने के लिए चारों ओर रखें।