2010-10-05 43 views
6

隨時糾正我的術語,如果需要列表的理解..如果您刪除()列表中的特定項目<T>是否也刪除了「空白插槽」?

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

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

我刪除用ID 72(例如)項和它正好是在列表第三...

將它最終像這樣...

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

或類似這樣的

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

現在在哪裏曾經被認爲是項目4項3等

請解釋一下,如果你能:)

回答

3

在您的例子

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

,如果你刪除[項目3],然後在列表級將剛纔複製的「背後」該項目的項目指標的陣列的一部分,列表的內部數組看起來就像這樣:

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

但是,您不能訪問,現在最後一個項目,因爲該列表會保持一個大小可變跟蹤可以訪問的項目數量。實際上,列表看起來就像是外部的第二個例子,但內部數組實際上可以更大。

編輯: 還要注意的是,在reallity數組是比這更大,因爲該名單<>將調整其插入項目時(當沒有足夠的空間用於新項目也將增加一倍,數組的大小) 。例如,如果添加5項列表,然後將列表就已經是這樣的:

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

優秀,所以不管我應該關心什麼,我很好奇這是否意味着我的列表可能永遠不會真正縮小,只會增長,就好像我移除了它保持相同大小的東西一樣,對吧? – BigOmega 2010-10-05 17:00:44

+1

除非您調用'TrimExcess()'或設置'Capacity'屬性,否則大小不會減小。 'List '實現不會在任何時候修剪數組,除非您明確要求它。 – 2010-10-05 17:56:02

14

第二個選項。它的行爲如同一個List,而不是一個數組。

可以刪除特定索引處的元素。在以前的元素和更高指數的指數由下降1

+1

這也是有用的注意,因爲這種行爲,列表中的內容的修改可能無法在foreach做迭代,因爲foreach的條件可能不會改變。 – 2010-10-05 15:08:42

+1

使用列表時,'空位'不會被刪除。元素通過Array.Copy移動,現在無效的最後一個'空槽'被默認(T)填充。 – sloth 2010-10-05 15:11:53

+0

@dkson和新的'空位'將在列表的最後? – BigOmega 2010-10-05 15:17:24

1

我的發言已得到糾正與技術性意見,但對於枚舉的目的,一個List對象,當你刪除一個項目就消失了,喜歡你第二個例子。

MSDN

6

實際上,隨着System.Collections.Generic.List<T>的實現中,用於存儲物品的底層陣列最終將這樣的:

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

即,在不改變所述陣列的尺寸,第三項已被移除,第四項和第五項已移位。

當然,如果枚舉集合,則會省略尾部空值,因爲集合的大小用於確定停止位置。 (編輯:並試圖超出了集合的邏輯結束訪問indicies將失敗。)

+6

這不是100%正確的。如果T是一個值類型,那麼List的數組中的最後一項不是null,而是該值類型的默認值。 – sloth 2010-10-05 14:38:05