2012-04-02 18 views
14

मैं अपने सूची से सभी तत्वों को नष्ट करना चाहते से सभी आइटम हटाएं: पिछले तत्व मेंएक सूची

foreach (Session session in m_sessions) 
{ 
    m_sessions.Remove(session); 
} 

मैं एक अपवाद प्राप्त करें: UnknownOperation।

कोई भी जानता है क्यों?

मुझे सभी तत्वों को कैसे हटाया जाना चाहिए?

m_sessions = new List<Session>(); 
+9

'm_Sessions.Clear()'? –

+0

सूची का प्रयास करें। साफ़ करें()। –

+0

क्या आप वाकई आखिरी तत्व के लिए सभी तरह से मिलते हैं, मुझे लगता है कि आपको पुनरावृत्ति – musefan

उत्तर

24

आप foreach साथ इस पर पुनरावृत्ति जबकि एक List<T> को संशोधित करने की अनुमति नहीं है: यह कुछ इस तरह लिखने के लिए ठीक है। इसके बजाय m_sessions.Clear() का उपयोग करें।

जबकि आप m_sessions = new List<Session>() लिख सकते हैं यह एक अच्छा विचार नहीं है। शुरुआत के लिए मौजूदा निकालने के लिए बस एक नई सूची बनाने के लिए अपर्याप्त है। और भी, यदि आपके पास सूची में अन्य संदर्भ हैं तो वे पुरानी सूची का उल्लेख जारी रखेंगे। हालांकि, @dasblinkenlight बताते हैं, m_sessions शायद एक निजी सदस्य है और यह संभावना है कि आपके पास सूची के अन्य संदर्भ हों। कोई फर्क नहीं पड़ता, Clear()List<T> को साफ़ करने का वैधानिक तरीका है।

+0

पर मिला, ठीक है, एक सूची इटेटर के साथ आप इसे पार करते समय एक सूची को सुरक्षित रूप से संशोधित कर सकते हैं। Iterators पिछले/अगले नोड्स के बारे में पता है और संशोधन के लिए डिजाइन किए गए हैं। लूप मैक्रोज़ के लिए मानक और जबकि लूप नहीं करते हैं। –

+0

+1 हालांकि, यह मानते हुए कि 'm_' * सदस्य * के लिए खड़ा है, और यह भी निजी है,' m_sessions' के अन्य संदर्भ होने से गहरे स्तर पर समस्याएं सामने आती हैं। – dasblinkenlight

+0

m_sessions = नया क्यों होगा ..; (या m_sessions = उस मामले के लिए शून्य, जो मैं इस में पढ़ रहा हूं) वास्तव में सूची को साफ़ करता है? –

8

foreach के साथ पुनरावृत्त किए जा रहे संग्रह को कभी भी संशोधित न करें। सम्मिलित करना, हटाना और पुनर्वितरण करना नहीं है। हालांकि, आप इस मामले में foreach चर (session) संशोधित कर सकते हैं।

इस मामले में,

m_sessions.Clear(); 

का उपयोग करें और लूप को समाप्त।

संबंधित मुद्दे