清空所有数组列表数据。

10

为什么下面的代码无法清除所有数组列表中的数据?

        Console.WriteLine("Before cleaning:" + Convert.ToString(ID.Count));
        //ID.Count = 20
        for (int i = 0; i < ID.Count; i++)
        {
            ID.RemoveAt(i);
        }
        Console.WriteLine("After cleaning:" + Convert.ToString(ID.Count));
        //ID.Count = 10

为什么屏幕上会打印出10?

也许有另一个特殊的函数,可以删除所有内容吗?


第一次循环时,您会删除位置为0的项目。现在列表中有19个项目,位置1的项目现在移到位置零,2->1,3->2等。第二次循环时,您会删除位置为1的项目(这曾经是项目2)。您已跳过位置0的项目(这曾经是项目1)。通过这种方式,您正在从列表中删除每个第二个项目。 - Binary Worrier
6个回答

12

你实际上只调用了RemoveAt 10次。当i达到10时,ID.Count也将为10。你可以通过以下方式解决这个问题:

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

尽管从列表中删除一个条目涉及复制其他所有内容,但这是O(n2)操作。

更高效的方法是O(n):

int count = ID.Count;
for (int i = 0; i < originalCount; i++)
{
    ID.RemoveAt(ID.Count - 1);
}

或者等效但更简单:

while (ID.Count > 0)
{
    ID.RemoveAt(ID.Count - 1);
}

但是使用 ID.Clear() 可能比所有这些方法都更有效,即使它也是 O(n)。


10
`Array.Clear()` 

移除数组中的所有项。

`Array.RemoveAt(i)` 

从数组中删除第i个索引的元素。


6

2

使用clear()方法

或者

ID.RemoveAt(i);更改为ID.RemoveAt(0);

每当从集合中删除一个元素时,其索引也会发生变化。因此,当您说 ID.RemoveAt(0); 时,现在的索引0处的元素将移动到索引1处。所以你需要再次删除相同的元素(就像出队一样),直到达到最后一个元素。但是,如果您想一次性删除所有元素,可以使用Clear()方法。


2

删除10个项目后,ID.Count() == 10并且i == 10,因此循环停止。

使用ID.Clear()来删除数组列表中的所有项。


1

您的代码实现了:

ID.RemoveAt(0);
...
ID.RemoveAt(9);
ID.RemoveAt(10); \\ at this point you have already removed 10 
                 \\ items so there is nothing left on 10- 19, but you are left with 
                 \\ the 'first' 10 elements
...
ID.RemoveAt(19);

一般来说,你的方法会从列表中删除每个第二个元素。

正如其他人所提到的那样,可以使用 ArrayList.Clear


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