C# 从列表中删除列表项后的行为<;项目>;在c中#

C# 从列表中删除列表项后的行为<;项目>;在c中#,c#,list,C#,List,我有listlist memory=newlist()。我使用这个列表在处理图像的简单程序中保存图像的状态。我想实现前后操作,这将在保存在内存中的状态之间迭代(=保存在列表内存中) 内存将只有一个有限的范围,例如20个状态,这意味着当我对一个图像进行20次修改,并在第21次修改时,我将删除第一个状态。可能是通过操作memory.RemoveAt(0)。那么名单会怎么样呢?我需要的列表比上一个列表有-1个项目,并且索引已移位 我有listlist.Count=20,我删除了第一项,我想要list.

我有list
list memory=newlist()。我使用这个列表在处理图像的简单程序中保存图像的状态。我想实现前后操作,这将在保存在内存中的状态之间迭代(=保存在列表内存中)

内存将只有一个有限的范围,例如20个状态,这意味着当我对一个图像进行20次修改,并在第21次修改时,我将删除第一个状态。可能是通过操作
memory.RemoveAt(0)。那么名单会怎么样呢?我需要的列表比上一个列表有-1个项目,并且索引已移位

我有list
list.Count=20
,我删除了第一项,我想要
list.Count=19
和移位的索引-类似于修剪自由空间,这样原始列表的索引1现在将有索引0,原始索引的索引2将有索引1,等等。。我找到了一个list
的方法,它可以做我想做的,但我不确定


当我拥有19个列表时,我可以通过
Add()
将新状态保存到最后一个位置,因此我将再次拥有20个列表。

列表管理索引而不是对象。因此,在
memory.RemoveAt(0)
之后,列表中的第一个对象(以前位于索引1)现在将位于索引0,计数自动为19。

不要将
列表
与数组混淆。数组有固定的位置和大小,而列表没有

对于数组,没有“添加”或“删除”项。数组始终具有创建时指定的长度

列表的长度是动态的。添加项目后,列表将增长。删除项目后,列表将缩小。如果将项目添加到列表中,该项目将始终附加到列表中(您可以调用
Insert
在指定位置插入)

但是,在任何给定的时间,列表中的条目将具有从0开始的索引,范围从
Count-1
(“基于零”)。即使删除列表中间位置X的项目,该索引处也会有一个项目(以前位于位置X+1的项目)

小结:您在“我需要什么”一段中描述的内容将自动完成,而无需在代码中执行任何进一步的操作

关于
TrimOverse
方法:列表具有
计数(列表中元素的实际数量)和
容量(列表无需调整其内部结构即可获取的元素的内部数量)。
容量可以大于
计数
。这是因为列表在内部将其项存储在数据结构中,在添加/删除时需要重新组织这些数据结构

为节省添加时的时间,
容量
以更大的步长增长。例如,当您将一个项目添加到一个已满的列表中时,会在内部创建4个新的“位置”,这样连续添加不会造成太多开销

TrimOverse
所做的是重新组织列表的内部数据结构,以便
容量
计数
匹配。列表中的项目越多,所需时间就越长,因此只有在确定不再需要添加/删除任何元素时才应调用
trimOverse

在您的情况下:不要使用
trimOverse
方法


容量
不限制列表的大小!在C#中,没有选项创建最多包含X个元素的列表。你得自己做。

哇,我不相信你们会把事情弄得这么复杂。OP想要的正是他想要的,如果他试图完全按照他所描述的去做的话

Memory.RemoveAt(0);
Memory.Add(myBmp);

所有位图索引将减少1,新位图将放在插槽20的末尾。

我注意到列表中有一个行为,当您继续添加元素时,它将添加索引增加的项。然而,如果您删除一个项List.remove(i)(i将是任何索引),然后尝试添加List.add(j),则项j将添加到堆栈的顶部。这意味着j指数是0

那么,是谁阻止你尝试呢?在这里,堆栈可能更合适,有一些类似的问题需要考虑。@MikeMiller:堆栈肯定不是更好的适合。堆栈是后进先出结构,而OP需要FIFO结构。您可能应该以某种方式重用旧的
位图。或者至少把它们处理掉。@Adamhuldsworth:他肯定已经说了他想要什么:。。。“
memory.RemoveAt(0);
…我删除了第一项…原始列表的索引1现在将具有索引0…”这显然是一个FIFO结构。我可以有一个小问题吗?在删除位图之前是否应该先处理它?正如有人提到的那样?我不确定C#中的垃圾收集器在这种情况下(从列表中删除位图)是如何工作的。我习惯于使用java和了解C#如果你知道你可以的话,处理对象从来都不是一个坏主意。:-)请注意,遵循以下指令顺序可能是个好主意:
list[x].Dispose();列表。删除(x)真。然后,他又把自己的问题贴上了“家庭作业”的标签,所以解释一下事情是如何/为什么会这样做也没那么糟糕;-)