我有列表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个。
答案 0 :(得分:12)
不要将List
与数组混淆。数组具有固定位置和固定大小,而列表则没有。
对于数组,不存在“添加”或“删除”项目。数组始终具有创建它时分配的长度。
列表的长度是动态的。您添加项目,列表增长。您删除项目,列表缩小。如果将项目添加到列表中,则该项目始终会附加到列表中(您可以调用Insert
以插入指定位置)。
但是,在任何给定时间,列表中的条目将具有从0开始的索引,范围为Count-1
(“基于零”)。即使您在列表中间的位置X处删除了一个项目,该索引处也会有一个项目(之前位于X + 1的那个项目)。
摘要:您在“我需要的内容”段落中所描述的内容是自动完成的,而代码中没有任何进一步操作。
关于TrimExcess
方法:列表中包含Count
(列表中元素的实际数量)和Capacity
(列表可以采用的内部元素数量,而无需调整其内部结构的大小)。 Capacity
可能大于Count
。这是因为在内部,列表将其项存储在数据结构中,需要在添加/删除时重新组织。
为了节省添加时间,Capacity
会以更大的步长增长。例如,当您将项目添加到已满的列表时,会在内部创建4个新“位置”,以便连续添加不会导致过多的开销。
TrimExcess
做的是重新组织列表的内部数据结构,以使Capacity
与Count
匹配。这需要花费更多时间,列表中的项目越多,因此只有在您确定不再需要添加/删除任何元素时才应调用TrimExcess
。
在您的情况下:取消TrimExcess
方法。
Capacity
不会限制列表的大小!在C#中,没有选项可以创建一个最多需要X个元素的列表。你必须自己做。
答案 1 :(得分:6)
列表管理索引而不是对象。因此,在memory.RemoveAt(0)
之后,列表中的第一个对象(以前在索引1处)现在将处于索引0并且计数自动为19。
答案 2 :(得分:2)
Memory.RemoveAt(0);
Memory.Add(myBmp);
所有位图索引将减少1,新位图将放在第20个插槽的末尾。
答案 3 :(得分:0)
我注意到列表中的行为,当您继续添加元素时,它将添加索引增加的项目。而如果您删除一个项目List.Remove(i)(我将是任何索引),然后尝试添加List.Add(j),则项目j将被添加到堆栈的顶部。这意味着j索引为0。