2012-04-02 34 views
14

Quiero borrar todos los elementos de mi lista:Eliminar todos los elementos de una lista

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

En el último elemento consigo una excepción: UnknownOperation.

¿Alguien sabe por qué?

¿cómo debo eliminar todos los elementos? No es buena idea escribir algo como esto:

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

'm_Sessions.Clear()'? –

+0

try list.Clear(). –

+0

¿Estás seguro de llegar hasta el último elemento? Creo que obtendrías una excepción en el primer intento de modificar una lista que se usa para la iteración – musefan

Respuesta

24

No está permitido modificar un List<T> mientras que la iteración sobre él con foreach. Use m_sessions.Clear() en su lugar.

Si bien podría escribir m_sessions = new List<Session>(), esta no es una buena idea. Para empezar, es un desperdicio crear una nueva lista solo para eliminar una existente. Además, si tiene otras referencias a la lista, continuarán refiriéndose a la lista anterior. Aunque, como @dasblinkenlight señala, m_sessions es probablemente un miembro privado y es poco probable que tenga otras referencias a la lista. No importa, Clear() es la manera canónica de borrar un List<T>.

+0

Exactamente, con un iterador de lista puede modificar una lista de forma segura al atravesarla. Los iteradores conocen los nodos anteriores/siguientes y están diseñados para modificaciones. Estándar para macros de bucle y mientras que los bucles no. –

+0

+1 Sin embargo, suponiendo que 'm_' representa * member *, y que también es privado, tener otras referencias a' m_sessions' indicaría problemas a un nivel más profundo. – dasblinkenlight

+0

¿Por qué m_sessions = new ..; (o m_sessions = null para el caso, ¿qué es lo que estoy leyendo sobre esto?) ¿borra realmente la lista? –

8

Nunca, nunca, modifique una colección que se está iterando con foreach. Insertar, eliminar y reordenar son no-nos. Sin embargo, puede modificar la variable foreach (session en este caso).

En este caso, el uso

m_sessions.Clear(); 

y eliminar el bucle.

Cuestiones relacionadas