我有以下集合,我使用方法输入一些值:
Collection<double> temp = new Collection<double>();
我想在某个时候删除集合中的所有项目,这样我就可以从初始开始再次填充它,就像我第一次初始化程序时一样。 我尝试过这样但它不起作用。
for (int i = 0; i < temp.Count; i++)
{
temp.RemoveAt(i);
}
有什么问题?
感谢您的帮助!
答案 0 :(得分:5)
使用Clear
方法:
temp.Clear();
你的循环不起作用的原因是因为当你执行RemoveAt
时,所有项目的索引都会发生变化。所以,说你从这开始:
6,2,8,5,3
在第一次迭代中,i
为0
,第一项将被移除:
2,8,5,3
对于第二次迭代,i
为1
,但不再是下一个要删除的项目,所以你得到了这个:
2,5,3
然后,i
为2
,您就明白了:
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);
}
这根本就没有使用集合迭代器,因为你在开始删除元素之前得到了计数,它不会失败。
如果您需要对每个元素等进行一些处理,然后才从列表中删除它,则只需要这样的东西。