2012-04-02 72 views
14

我想删除所有从我的列表中的元素的所有项目:删除列表

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

在最后一个元素我得到一个异常:UnknownOperation。

任何人都知道为什么?

我该如何删除所有元素?它是确定如下内容:

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

'm_Sessions.Clear()'? – 2012-04-02 16:37:21

+0

尝试list.Clear()。 – 2012-04-02 16:37:43

+0

你确定你到达最后一个元素,我想你会在第一次尝试修改用于迭代的列表时出现异常 – musefan 2012-04-02 16:39:37

回答

24

你不允许修改List<T>同时遍历它foreach。改为使用m_sessions.Clear()。您可以写m_sessions = new List<Session>()这不是一个好主意。首先,创建一个新清单是为了清除现有清单而造成的浪费。更重要的是,如果您有其他参考列表,那么他们将继续参考旧列表。虽然,@ dasblinkenlight指出,m_sessions可能是一个私人成员,它不太可能有其他的引用。无论如何,Clear()是清除List<T>的标准方法。

+0

确切地说,与列表迭代器,你可以安全地修改列表,而遍历它。迭代器知道前一个/下一个节点,并且是为修改而设计的。循环宏和while循环没有标准。 – 2012-04-02 16:40:42

+0

+1但是,假设'm_'代表* member *,并且它也是私有的,那么对'm_sessions'的其他引用将会在更深层次上指出问题。 – dasblinkenlight 2012-04-02 16:42:00

+0

为什么会m_sessions = new ..; (或者m_sessions = null,这正是我正在阅读的内容)实际上清除了列表? – 2012-04-02 16:43:59

8

永远不会修改正在迭代的集合,其格式为foreach。插入,删除和重新排序都是非数字。但是,您可以修改变量foreach(在这种情况下为session)。

在这种情况下,使用

m_sessions.Clear(); 

并消除回路。