0

我正在编写一个应用程序,我想在其中实现一个对象数组,该数组将定期添加一个新项目。

我总是想知道添加的最后一个对象是哪个并且正在考虑将该对象放置在位置 0。(因此将每个项目向下推一个索引到最多 130 个项目)

这很容易使用 List 来实现

items.Insert(0,new item());
items.RemoveAt(130);

然后它将自动将每个项目向下推并在 130 处删除该项目,但这对于数组来说并不是那么简单

我最初的想法在某个地方

for(int i = 129; i>0;i--)
{
 items[i] = items[i-1]; 
}
items[0] = new item();

然后,这允许我简单地访问最新的项目(通过索引 [0]),以及按创建顺序(1 -> 129)的每个前面的项目;

现在这本身很简单,我想知道是否还有其他方法可以执行此操作。

编辑:感谢您的快速回复,

我已经对此进行了一些测试(使用 100 万次迭代),似乎队列方法在这里是最快的,但仅比列表略高,然后是数组,处理 100 万个项目的时间长了大约 50%

我想我会探索队列堆栈选项

再次感谢;

4

3 回答 3

5

我总是想知道添加的最后一个对象是哪个并且正在考虑将该对象放置在位置 0。(因此将每个项目向下推一个索引到最多 130 个项目)
......
现在这本身就很简单我想知道但是,如果有任何其他方式来执行此操作。

是的,有一种更简单的方法可以通过使用已经构建的结构来执行此操作,即队列(First Input First Output)。您主要需要三种方法:

  • Enqueue()将对象添加到队列的末尾。

  • Dequeue()返回队列 开头的对象,将其删除

  • Peek()返回队列 开头的对象而不删除它

于 2012-12-31T01:03:35.253 回答
0

您的循环是不必要的, Array.Insert 将为您“向下移动”元素。

但是,如果您真的想始终在开头添加新元素,则 LinkedList 出于性能原因会更好,因为无论您在何处插入元素,它都不需要移动元素。

于 2012-12-31T01:01:48.000 回答
-1

我认为这将尽可能简单。就我个人而言,我会将其设为通用扩展方法。

public static void Insert<T>(this T[] array, int position, T item)
{
    for ( int i = array.Length-1; i > position; i-- )
        array[i] = array[i-1];

    array[position] = item;
}

所以你可以像这样使用它

string[] lolCats = { "ceiling cat", "invisible bike cat", "lime cat" };

lolCats.Insert(0, "monorailcat");
于 2012-12-31T01:05:06.920 回答