2012-04-02 25 views
14

voglio eliminare tutti gli elementi dalla mia lista:Eliminare tutti gli elementi da un elenco

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

Nell'ultimo elemento ottengo un'eccezione: UnknownOperation.

Qualcuno sa perché?

come devo eliminare tutti gli elementi? E 'ok per scrivere qualcosa del genere:

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

'm_Sessions.Clear()'? –

+0

prova list.Clear(). –

+0

Sei sicuro di arrivare fino all'ultimo elemento, penserei che otterresti un'eccezione al primo tentativo di modificare un elenco che viene utilizzato per l'iterazione – musefan

risposta

24

Non è consentito modificare List<T> mentre l'iterazione su di esso con foreach. Utilizzare invece m_sessions.Clear().

Mentre è possibile scrivere m_sessions = new List<Session>() questa non è una buona idea. Per cominciare è uno spreco creare un nuovo elenco solo per cancellare uno esistente. Inoltre, se hai altri riferimenti all'elenco, continueranno a fare riferimento alla vecchia lista. Anche se, come sottolinea @dasblinkenlight, m_sessions è probabilmente un membro privato ed è improbabile che tu abbia altri riferimenti all'elenco. Non importa, Clear() è il modo canonico per cancellare uno List<T>.

+0

Esattamente, con un iteratore di lista puoi tranquillamente modificare un elenco mentre lo attraversi. Iteratori conoscono i nodi precedenti/successivi e sono progettati per le modifiche. Standard per macro loop e loop while no. –

+0

+1 Tuttavia, partendo dal presupposto che 'm_' sta per * member *, e che sia anche privato, avendo altri riferimenti a' m_sessions' indicheresti problemi ad un livello più profondo. – dasblinkenlight

+0

Perché m_sessions = new ..; (o m_sessions = null per quella materia, che è quello che sto leggendo in questo) in realtà cancellare la lista? –

8

Mai e poi mai modificare una raccolta che viene iterata su foreach. L'inserimento, l'eliminazione e il riordino sono no-no. Tuttavia, è possibile modificare la variabile foreach (session in questo caso).

In questo caso, utilizzare

m_sessions.Clear(); 

ed eliminare l'anello.

Problemi correlati