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

Met*_*uru 6 c#

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

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

[item 1]
[item 2]
[item 3]
[item 4]
[item 5]
Run Code Online (Sandbox Code Playgroud)

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

会不会像这样结束......

[item 1]
[item 2]
[null]
[item 4]
[item 5]
Run Code Online (Sandbox Code Playgroud)

或者像这样

[item 1]
[item 2]
[item 3]
[item 4]
Run Code Online (Sandbox Code Playgroud)

过去的第4项现在是第3项,等等.

请解释一下你是否可以:)

mat*_*ash 14

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

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


Mic*_*ito 6

实际上,通过实现System.Collections.Generic.List<T>,用于存储项目的底层数组最终将如下所示:

[item 1]
[item 2]
[item 4]
[item 5]
[null]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这不是100%正确.如果T是值类型,则List的数组中的最后一项不是null,而是该值类型的默认值. (6认同)

slo*_*oth 3

在你的例子中

[item 1]
[item 2]
[item 3]
[item 4]
[item 5]
Run Code Online (Sandbox Code Playgroud)

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

[item 1]
[item 2]
[item 4]
[item 5]
[default(item)]
Run Code Online (Sandbox Code Playgroud)

但是,您无法访问现在的最后一个项目,因为列表保留了一个大小变量来跟踪可以访问的项目数量。因此实际上,列表从外部看起来就像您的第二个示例,但内部数组实际上可以更大。

编辑: 还要注意,实际上数组比这个大得多,因为 List<> 在插入项目时会调整它的大小(当没有足够的空间容纳新项目时,它将使数组大小加倍)。例如,如果您向列表添加 5 个项目,那么您的列表将如下所示:

[item 1]
[item 2]
[item 3]
[item 4]
[item 5]
[default(item)]
[default(item)]
[default(item)]
Run Code Online (Sandbox Code Playgroud)