5

我有清单List <Bitmap> memory = new List<Bitmap>();。我使用此列表将图像状态保存在用于处理图像的简单程序中。我想实现前后操作,这将在保存在内存中的状态之间迭代(=保存在列表内存中)。

内存只有有限的范围,例如 20 个状态,这意味着当我对图像进行 20 次修改并且我进行第 21 次修改时,我将删除第一个状态。大概是通过手术吧memory.RemoveAt(0);。那么列表会发生什么?我需要的列表比前一个列表包含 -1 个项目并且具有移位的索引。

我有 list list.Count = 20,我删除了第一项,我想要list.Count = 19并移动了索引 - 比如修剪空闲空间,所以原始列表的索引 1 现在将具有索引 0,而原始索引的索引 2 将具有索引 1,等等。我找到了一个方法的列表TrimExcess,它会做我想要的,但我不确定。

当我有 19 个列表时,我可以将新状态保存到最后一个位置Add(),所以我将再次获得 20 个列表。

4

4 回答 4

15

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

对于数组,没有“添加”或“删除”项目之类的东西。数组始终具有创建时分配的长度。

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

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

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

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

为了在添加时节省时间,Capacity会以更大的步幅增长。例如,当您将一个项目添加到一个已满的列表中时,内部会创建 4 个新的“位置”,因此连续添加不会导致太多开销。

所做的是TrimExcess重新组织列表的内部数据结构,以便Capacity匹配Count. 这花费的时间越多,列表中的项目越多,因此TrimExcess只有在您确定不再需要添加/删除任何元素时才应调用。

在您的情况下:放弃该TrimExcess方法。

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

于 2012-06-12T11:00:22.597 回答
6

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

于 2012-06-12T10:59:59.290 回答
2

哇,我不相信你们这么复杂。如果他试图完全按照他的描述去做,那么 OP 想要的正是他将得到的。

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

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

于 2012-06-12T11:22:37.197 回答
0

我注意到 List 中的一种行为,当您继续添加元素时,它会添加具有递增索引的项目。然而,如果您删除一项 List.Remove(i)(i 将是任何索引)然后尝试添加 List.Add(j),则该项 j 将添加到堆栈的顶部。这意味着 j 索引为 0。

于 2019-02-12T23:40:46.047 回答