如果你.Remove()List <t>中的特定项目是否也删除了'空槽'?</t>

时间:2010-10-05 14:17:39

标签: c#

如果需要,请随意更正我的术语和理解列表。

如果我有五个项目的列表,其中每个项目都有唯一的ID ...

[item 1]
[item 2]
[item 3]
[item 4]
[item 5]

我删除ID为72的项目(例如),它恰好是列表中的第3个...

它会像这样结束......

[item 1]
[item 2]
[null]
[item 4]
[item 5]

或者像这样

[item 1]
[item 2]
[item 3]
[item 4]

以前的第4项现在是第3项等等。

请解释您是否可以:)

4 个答案:

答案 0 :(得分:14)

第二种选择。它表现为List,而不是数组。

  

可以删除特定索引处的元素。该指数和较高指数的先前元素指数减少1。

答案 1 :(得分:6)

实际上,随着System.Collections.Generic.List<T>的实现,用于存储项目的基础数组最终将如下所示:

[item 1]
[item 2]
[item 4]
[item 5]
[null]

也就是说,在不改变数组大小的情况下,第3项已被删除,第4项和第5项已被移位。

当然,如果枚举集合,则会省略尾随空值,因为集合的大小用于确定停止的位置。 (编辑:尝试访问集合逻辑末尾之外的指标将失败。)

答案 2 :(得分:3)

在你的例子中

[item 1]
[item 2]
[item 3]
[item 4]
[item 5]

如果删除[item 3],那么List-class只会将该项后面的数组部分复制到items索引中,列表的内部数组将如下所示:

[item 1]
[item 2]
[item 4]
[item 5]
[default(item)]

但是,您无法访问现在的最后一项,因为List会保留一个大小变量来跟踪可以访问的项目数。实际上,List看起来像是你外面的第二个例子,但内部数组实际上可能更大。

修改 还要注意,实际上阵列比那个大得多,因为List&lt;&gt;插入项目时会调整大小(当新项目没有足够的空间时,它会使数组大小加倍)。例如,如果您向列表中添加5个项目,那么您的列表将如下所示:

[item 1]
[item 2]
[item 3]
[item 4]
[item 5]
[default(item)]
[default(item)]
[default(item)]

答案 3 :(得分:1)

我的陈述已经通过技术观察得到了纠正,但是出于可枚举的目的,一个List对象,当你删除一个项目时,它就像你的第二个例子一样。

MSDN