Listにそれ以上要素を追加する必要がなくなった場合などには、TrimExcessメソッドを使用することで不要な容量を減らすことができます。
TrimExcessメソッドを使ってList内部の不要になっている容量を減らす
using System;
using System.Collections.Generic;
class Sample {
static void Main()
{
// 空のListを作成
var list = new List<int>();
// 1500個の要素を追加
for (var 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に対する操作 | 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 |