在 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 个列表。

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

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

对于数组,没有"添加"或"删除"项目这样的事情。数组始终具有创建数组时分配的长度。

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

但是,在任何给定时间,列表中的条目都将具有从 0 到 Count-1 的索引("从零开始")。即使您删除了位于"列表中间"位置 X 的项目,该索引中也会有一个项目(之前位于位置 X+1 的项目)。

摘要:您在"我需要什么"段落中描述的内容是自动完成的,无需在代码中执行任何进一步操作。

关于TrimExcess方法:列表具有Count(列表中元素的实际数量)和Capacity(列表无需调整其内部结构大小即可采用的内部元素数)。Capacity可以大于 Count 。这是因为列表在内部将其项目存储在添加/删除时需要重新组织的数据结构中。

为了节省添加时间,Capacity以更大的步骤增长。例如,当您将项目添加到已满的列表时,会在内部创建 4 个新"位置",以便连续添加不会产生太多开销。

TrimExcess所做的是重新组织列表的内部数据结构,以便CapacityCount匹配。这花费的时间越多,列表中的项目就越多,因此仅当您确定不再需要添加/删除任何元素时,才应调用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。