在 c# 中从列表<项中删除列表项后的行为>
本文关键字:列表 删除列 删除 | 更新日期: 2023-09-27 18:37:04
我有列表List <Bitmap> memory = new List<Bitmap>();
.我使用此列表在处理图像的简单程序中保存图像状态。我想前后实现操作,这将在保存在内存中的状态之间迭代(= 保存在列表内存中)。
内存将只有一个有限的范围,例如 20 个状态,这意味着当我对图像进行 20 次修改并且我进行第 21 次修改时,我将删除第一个状态。可能是通过操作memory.RemoveAt(0);
.那么名单会发生什么?我需要比上一个列表包含 -1 个项目和移动索引的列表。
我有列表list.Count = 20
,我删除了第一项,我想要list.Count = 19
和移动索引 - 类似于修剪可用空格的东西,所以原始列表的索引 1 现在将具有索引 0,原始索引的索引 2 将具有索引 1,依此类推。我找到了一种列表TrimExcess
的方法,它会做我想做的,但我不确定。
当我有 19 个列表时,我可以将新状态保存到最后一位 Add()
,所以我将再次拥有 20 个列表。
不要将List
与数组混淆。数组具有固定的位置和固定的大小,而列表则没有。
对于数组,没有"添加"或"删除"项目这样的事情。数组始终具有创建数组时分配的长度。
列表的长度是动态的。您添加项目,列表就会增长。删除项目,列表会缩小。如果将项目添加到列表中,则该项目始终追加到列表中(可以调用 Insert
以在指定位置插入)。
但是,在任何给定时间,列表中的条目都将具有从 0 到 Count-1
的索引("从零开始")。即使您删除了位于"列表中间"位置 X 的项目,该索引中也会有一个项目(之前位于位置 X+1 的项目)。
摘要:您在"我需要什么"段落中描述的内容是自动完成的,无需在代码中执行任何进一步操作。
关于TrimExcess
方法:列表具有Count
(列表中元素的实际数量)和Capacity
(列表无需调整其内部结构大小即可采用的内部元素数)。Capacity
可以大于 Count
。这是因为列表在内部将其项目存储在添加/删除时需要重新组织的数据结构中。
为了节省添加时间,Capacity
以更大的步骤增长。例如,当您将项目添加到已满的列表时,会在内部创建 4 个新"位置",以便连续添加不会产生太多开销。
TrimExcess
所做的是重新组织列表的内部数据结构,以便Capacity
与Count
匹配。这花费的时间越多,列表中的项目就越多,因此仅当您确定不再需要添加/删除任何元素时,才应调用TrimExcess
。
在您的情况下:放开TrimExcess
方法。
Capacity
不限制列表的大小!在 C# 中,没有用于创建最多包含 X 个元素的列表的选项。你必须自己做。
列表管理索引而不是对象。因此,在 memory.RemoveAt(0)
之后,列表中的第一个对象(以前位于索引 1)现在将位于索引 0 处,计数自动为 19。
我不相信你们把这件事复杂化了这么多。 OP想要的正是如果他试图完全按照他所描述的去做,他会得到什么。
Memory.RemoveAt(0);
Memory.Add(myBmp);
所有位图索引将减少 1,新位图将放置在插槽 20 的末尾。
我注意到列表中的一种行为,即当您继续添加元素时,它将添加索引递增的项目。而如果您删除一个项目 List.Remove(i)(i 将是任何索引),然后尝试添加 List.Add(j),则项目 j 将添加到堆栈的顶部。这意味着 j 指数为 0。