Listにそれ以上要素を追加する必要がなくなった場合などには、TrimExcessメソッドを使用することで不要な容量を減らすことができます。
TrimExcessメソッドを使ってList内部の不要になっている容量を減らす
Imports System
Imports System.Collections.Generic
Class Sample
Shared Sub Main()
' 空のListを作成
Dim list As New List(Of Integer)
' 1500個の要素を追加
For i As Integer = 0 To 1500 - 1
list.Add(i)
Next
' 先頭から500個の要素を削除
list.RemoveRange(0, 500)
' 要素数とListの容量を表示
Console.WriteLine("[before]")
Console.WriteLine("Count={0} Capacity={1}", list.Count, list.Capacity)
' Listが確保している容量を必要最低限に減らす
list.TrimExcess()
' 要素数とListの容量を表示
Console.WriteLine("[after]")
Console.WriteLine("Count={0} Capacity={1}", list.Count, list.Capacity)
End Sub
End Class
実行結果
[before] Count=1000 Capacity=2048 [after] Count=1000 Capacity=1000
このメソッドはList内の再割当てを行うことで使用するメモリを最小化します。 そのため、Listにそれ以上変更を加えない(追加によって容量を再度拡張する必要がない)ことが明らかな場合などに用いるべきで、不必要に何度も呼び出すことはパフォーマンスの劣化に繋がります。
Listに対する操作 | List内部の状態 | |
---|---|---|
- |
0
1
〜
499
500
〜
〜
1499
(空き)
〜
〜
(空き)
(操作前の状態・インデックス1500〜2047までの領域は空きとなっている) |
Count=1500 Capacity=2048 |
list.RemoveRange(0, 500) |
(空き)
〜
〜
(空き)
500
〜
〜
1499
(空き)
〜
〜
(空き)
(インデックス0〜499までの領域が空きとなる) |
Count=1000 Capacity=2048 |
list.TrimExcess() |
500
〜
〜
1499
(領域の再作成と要素の再配置が行われ、必要最低限の容量になる) |
Count=1000 Capacity=1000 |