从c#</item>中的List <item>中删除列表项后的行为

时间:2012-06-12 10:56:38

标签: c# list

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

4 个答案:

答案 0 :(得分:12)

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

对于数组,不存在“添加”或“删除”项目。数组始终具有创建它时分配的长度。

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

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

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

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

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

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

在您的情况下:取消TrimExcess方法。

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

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