如果需要,请随意更正我的术语和理解列表.
如果我有一个包含五个项目的列表,其中每个项目都有一个唯一的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项,等等.
请解释一下你是否可以:)
实际上,通过实现System.Collections.Generic.List<T>
,用于存储项目的底层数组最终将如下所示:
[item 1]
[item 2]
[item 4]
[item 5]
[null]
Run Code Online (Sandbox Code Playgroud)
也就是说,在不改变数组大小的情况下,第3项已被删除,第4和第5项已被移位.
当然,如果枚举集合,则会省略尾随空值,因为集合的大小用于确定停止的位置.(编辑:尝试访问集合逻辑末尾之外的指标将失败.)
在你的例子中
[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)