从C#中的System.Collections.ObjectModel.Collection中删除所有项目

时间:2013-11-24 16:32:03

标签: c#

我有以下集合,我使用方法输入一些值:

 Collection<double> temp = new Collection<double>();

我想在某个时候删除集合中的所有项目,这样我就可以从初始开始再次填充它,就像我第一次初始化程序时一样。 我尝试过这样但它不起作用。

 for (int i = 0; i < temp.Count; i++)
        {
            temp.RemoveAt(i);
        }

有什么问题?

感谢您的帮助!

5 个答案:

答案 0 :(得分:5)

使用Clear方法:

temp.Clear();

你的循环不起作用的原因是因为当你执行RemoveAt时,所有项目的索引都会发生变化。所以,说你从这开始:

  

6,2,8,5,3

在第一次迭代中,i0,第一项将被移除:

  

2,8,5,3

对于第二次迭代,i1,但不再是下一个要删除的项目,所以你得到了这个:

  

2,5,3

然后,i2,您就明白了:

  

2,5

现在i> temp.Count。了解如何留下剩余的物品?

答案 1 :(得分:2)

您可以使用Clear()方法 -

temp.Clear();

答案 2 :(得分:1)

通过调用RemoveAt,您假设在给定索引处确实存在项目。但是,通过删除它,该集合只有一个项目,因此您的for循环没有意义。它不会因为在每次迭代期间评估temp.Count而引发异常。实际上,它只会从集合中删除所有其他项目。

相反,请使用Clear方法。

答案 3 :(得分:1)

你不能使用索引删除,只要你删除第一个项目,集合得到重新索引,第二个元素成为第一个,第三个成为第二个等。你将删除每个奇数元素,并在出去后得到和异常集合大小。在.net实现中,你可能会得到一个异常的预告片,一旦你删除第一个项目,枚举器会抱怨你不能修改你正在枚举的集合。

有很多方法可以解决这个问题,最简单的方法是使用专用方法清除集合(Clear)。在收集引用的情况下,您还可以创建原始集合中引用的副本集合,并迭代克隆的集合,但从原始集合中删除。

答案 4 :(得分:0)

如果你真的需要一次删除一个元素(而不是一次性调用Clear()删除它们),那么你需要以相反的顺序迭代:

int count = temp.Count;
for (int i = count-1; i >= 0; i--)
{
    temp.RemoveAt(i);
}

这将删除列表末尾的元素,以便您的索引始终在剩余列表的范围内,并从列表中删除所有项目。

或仅将大小用作计数器:

int count = temp.Count;
for (int i = 0; i < count ; i++)
{
    temp.RemoveAt(0);
}

这根本就没有使用集合迭代器,因为你在开始删除元素之前得到了计数,它不会失败。

如果您需要对每个元素等进行一些处理,然后才从列表中删除它,则只需要这样的东西。