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

use*_*772 4 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个.

Tho*_*mar 13

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

对于数组,没有"添加"或"删除"项目.数组始终具有创建时指定的长度.

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

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

简介:您在"我需要的内容"段落中描述的内容是自动完成的,代码中没有任何进一步的操作.

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

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

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

在你的情况下:放弃TrimExcess方法.

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


Fra*_*nky 6

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