左移数组还是使用列表中的 add/remove?

Shift Array left or work with add/remove from List?

我有一个花车列表:

List<float> myList = new List<float>(100);

列表的工作方式类似于左移数组,其中列表中的第一个对象被删除,新对象被添加到列表的末尾。像那样:

myList.RemoveAt(0);
myList.Add(sampleFromCollection);

我想知道使用数组(具有左移方法)而不是列表是否会更快?

您应该使用 Queue 而不是 List。使用 Enqueue 方法添加到列表中,使用 Dequeue 从前面弹出一个。例如:

Queue<string> numbers = new Queue<string>();
numbers.Enqueue("one");
numbers.Enqueue("two");
numbers.Enqueue("three");
numbers.Enqueue("four");
numbers.Enqueue("five");

while(numbers.Count > 0)
{
    string value = numbers.Dequeue();
    //Do something with the value
}

你明白List的底层表示是一个数组吧?它不一定是,但随机访问是恒定的时间,并且添加的成本通过以块为单位增长数组来摊销。

这意味着从 "head" 中删除的成本与从数组中删除的成本完全相同,因为需要完成的工作量相同。

删除后添加将是固定时间,因为它保证您要添加的项目会有 space。

如果您确实需要在任一端进行快速删除并在任一端进行快速添加,但可以在没有恒定时间随机访问的情况下生存,您可能需要使用双端队列。如果您要从前面删除并添加到后面,请使用一个队列,该队列对于删除或添加来说都是恒定的时间。