我有以下object[] array
:
array[0] = obj_1;
array[1] = obj_2;
array[2] = obj_3;
array[3] = NULL;
array[4] = NULL;
我需要在array[1]
和array[2]
之间插入另一个元素,如下所示:
array[0] = obj_1;
array[1] = obj_2;
array[2] = obj_New;
array[3] = obj_3;
array[4] = NULL;
在有人建议之前我无法使用List
。有关如何做到这一点的任何想法?
答案 0 :(得分:5)
没有直接的方法。您需要先移动元素,然后将值设置为所需的索引。
下面是示例代码段(没有任何数组索引检查)
void InsertItem(object[] array, int index, object val)
{
for(int i=index;i<array.Length;i++)
{
array[i] = array[i-1];
}
array[index] = val;
}
请注意,一旦创建的数组被分配了连续的位置,并且具有固定的大小。他们不能随心所欲地移动。
如果您需要各种此类操作,我建议使用linked list数据结构。
答案 1 :(得分:0)
从你的帖子中,听起来你想要从阵列中弹出最后一项,而不是第一项。
如果是这样,就像Tilak所建议的那样,最简单的方法是获取/确定项目必须插入的索引,并将项目从当前位置移动到下一个后续位置,最后在给定索引中添加新项目。如果数组已满,你想要注意会发生什么,你想丢弃最后一项吗?
我们可以在Tilak的代码中优化一点,不要覆盖数组[index]项两次,一次在循环中,一次在外面。
我会做的有点不同,我会从头开始然后上升,所以你可以避免临时变量。
void InsertItem(object[] array, int index, object val) { for(int i=array.Length - 1; i > index; i--) { array[i] = array[i-1]; } array[index] = val; }
就像其他人已经说过的那样,List或LinkedList将是更好的选择。
答案 2 :(得分:0)
我只需要一盏灯就可以了。我使用Tilak的示例作为我的基础,我做了以下代码(还有更多的东西,比如在列表的末尾加上一个起始的空数组):
object[] array = new object[0];
public void Insert(int index, object val)
{
Array.Resize(ref array, array.Length + 1);
if (index >= array.Length-1)
{
array[array.Length - 1] = val;
return;
}
for (int i = 0; i < array.Length; i++)
{
if (index == i)
{
for (int idx = array.Length; idx > index; idx--)
{
array[idx-1] = array[idx-2];
}
array[i] = val;
return;
}
}
}
它完全正常运行,每次插入内容时Array.Resize
都会激活,以便我的数组始终具有我需要的确切数量的插槽。