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.TrimExcessと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

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。