从列表中删除所有项目

45

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

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

在最后一个元素处,我遇到了一个异常:UnknownOperation。

有人知道为什么吗?

我应该如何删除所有元素?像这样写可以吗:

m_sessions = new List<Session>();

11
这句话的意思是清除变量 m_Sessions 中的所有数据。 - L.B
1
你确定已经遍历到了最后一个元素吗?我认为你应该在第一次尝试修改用于迭代的列表时就会抛出异常。 - musefan
很奇怪你没有收到并发修改异常。 - Sergey Kalinichenko
@dasblinkenlight 你说得对,我只有一个元素,所以我把它放在了第一个和最后一个位置。 - janneob
3个回答

58

在使用 foreach 循环遍历 List<T> 的时候,不允许修改该列表。可以使用 m_sessions.Clear() 来清空列表。

虽然你可以写 m_sessions = new List<Session>(),但这不是一个好主意。首先,创建一个新列表只是为了清空现有的列表是浪费的。此外,如果您还有对该列表的其他引用,则它们将继续引用旧列表。尽管 @dasblinkenlight 指出,m_sessions 可能是一个私有成员,你可能没有对这个列表的其他引用。无论如何,使用 Clear() 是清空 List<T> 的标准方法。


确切地说,在使用列表迭代器时,您可以在遍历列表时安全地修改它。迭代器知道前一个/后一个节点,并且专为修改而设计。标准的for循环宏和while循环则不行。 - Mike McMahon
+1 但是,假设 m_ 代表 成员,并且它也是私有的,那么其他对 m_sessions 的引用将表明存在更深层次的问题。 - Sergey Kalinichenko
为什么 m_sessions = new ..; (或者说 m_sessions = null,这是我理解的)会清空列表? - Captain Giraffe
@CaptainGiraffe 不,旧列表不会被清除,但是 m_sessions 将引用一个不同的列表,即一个新实例。 - David Heffernan
好的,"为了清空现有列表而创建新列表是浪费的。" 清空 = 使消失。 - Captain Giraffe

14

切勿在使用foreach迭代集合时对其进行修改,包括插入、删除和重新排序等操作。但可以修改foreach变量(本例中为session)。

在这种情况下,请使用

m_sessions.Clear();

并消除循环。


0

试试这个:

m_sessions.RemoveRange ( 0 , m_sessions.Count() );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接