2012-04-02 15 views
14

chcę usunąć wszystkie elementy z mojej listy:Usuń wszystkie przedmioty z listy

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

W ostatnim elemencie uzyskać wyjątek: UnknownOperation.

Ktoś wie dlaczego?

Jak usunąć wszystkie elementy? Jest ok, aby napisać coś takiego:

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

'm_Sessions.Clear()'? –

+0

wypróbuj listę. Usuń(). –

+0

Jesteś pewny, że dostałeś się do ostatniego elementu, myślę, że otrzymasz wyjątek przy pierwszej próbie modyfikacji listy używanej do iteracji – musefan

Odpowiedz

24

nie wolno modyfikować List<T> podczas iteracji nad nią foreach. Zamiast tego użyj m_sessions.Clear().

Chociaż można napisać m_sessions = new List<Session>(), to nie jest dobry pomysł. Na początek marnuje się tworzenie nowej listy tylko po to, by usunąć istniejącą. Co więcej, jeśli masz inne odniesienia do listy, będą one nadal odnosić się do starej listy. Chociaż, jak wskazuje @dasblinkenlight, m_sessions jest prawdopodobnie członkiem prywatnym i jest mało prawdopodobne, że masz inne odniesienia do listy. Niezależnie od tego, Clear() jest kanonicznym sposobem na wyczyszczenie List<T>.

+0

Dokładnie, z iteratorem listy można bezpiecznie modyfikować listę podczas przechodzenia przez nią. Iteratory znają poprzednie/następne węzły i są przeznaczone do modyfikacji. Standardowy dla makr pętli i pętli while nie. –

+0

+1 Jednak zakładając, że 'm_' oznacza * member *, i że jest również prywatne, posiadanie innych odniesień do' m_sessions' wskazywałoby problemy na głębszym poziomie. – dasblinkenlight

+0

Dlaczego m_sessions = new ..; (lub m_sessions = null dla tej sprawy, która jest tym, co czytam w tym) faktycznie wyczyścić listę? –

8

Nigdy, przenigdy, nie modyfikuj kolekcji, która jest iterowana za pomocą foreach. Wstawianie, usuwanie i zmiana kolejności nie są nosami. Możesz jednak w tym przypadku zmodyfikować zmienną foreach ().

W tym przypadku, należy

m_sessions.Clear(); 

i eliminacji pętli.