Listにそれ以上要素を追加する必要がなくなった場合などには、TrimExcessメソッドを使用することで不要な容量を減らすことができます。

TrimExcessメソッドを使ってList内部の不要になっている容量を減らす
using System;
using System.Collections.Generic;

class Sample {
  static void Main()
  {
    // 空のListを作成
    List<int> list = new List<int>();

    // 1500個の要素を追加
    for (int i = 0; i < 1500; i++) {
      list.Add(i);
    }

    // 先頭から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);
  }
}
実行結果
[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