【问题标题】:how to implement an object[] where as top object is always the latest?如何实现一个对象[],其中顶级对象始终是最新的?
【发布时间】:2012-12-15 07:13:39
【问题描述】:

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

我总是想知道最后添加的对象是哪个并且正在考虑将该对象放置在位置 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();

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

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

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

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

我想我会探索 queue 堆栈选项

再次感谢;

【问题讨论】:

标签: c# arrays xna


【解决方案1】:

我总是想知道最后添加的对象是哪个对象,过去是哪个对象 考虑将该对象放置在位置 0。(从而推动每个项目 减少一个索引到最多 130 个项目)
...
现在这本身就很简单,我想知道是否有 是否有任何其他方式来执行此操作。

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

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

  • Dequeue() 返回队列开始处的对象删除它

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

【讨论】:

  • 据我了解,OP 似乎在寻找堆栈 (FiLo) 而不是队列 (FiFo)
  • 确实,我认为您可能是正确的,堆栈会更适合
  • 感谢您的回复,但在某些方面问题确实不清楚。不过没关系,如果你需要here是一个集合列表。选择你认为更合适的。 ;)
【解决方案2】:

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

但如果你真的想总是在开头添加新元素,LinkedList 出于性能原因会更好,因为无论你在哪里插入元素,它都不需要移动元素。

【讨论】:

    【解决方案3】:

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

    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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      相关资源
      最近更新 更多