Listは要素の数は可変ですが、現在の要素数(Count)を超えるインデックスを指定した場合は例外ArgumentOutOfRangeExceptionがスローされます。 例えば、次のコードのように現在の要素数よりも大きなインデックスを指定しても、その分の容量が自動的に確保されるわけではない点に注意してください。
JavaScript等では認められているこのような操作は、Listクラスでは行うことはできない
var arr = new Array();
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[99] = 99; // arr.length = 100
Listにおける容量の自動的な拡張は、Addメソッドなどによって要素が追加・挿入される場合にのみ行われます。 従って、上記のように現在の要素数よりも大きいインデックスに要素を格納したい場合は、Addメソッドを使って必要な要素数になるまで適当な値の追加を繰り返す必要があります。
Addメソッドを使ってListの容量を拡張する
using System;
using System.Collections.Generic;
class Sample {
static void Main()
{
// 要素数が3(=インデックスの上限が2)のList
var list = new List<int>() {0, 1, 2};
// インデックス99に値を設定するために、
// 要素数が100になるまでListに適当な値を追加する
while (list.Count < 100) {
list.Add(-1);
}
// インデックス99に値を設定する
list[99] = 99;
}
}
あるいは、あらかじめ必要な要素数を確保した配列を用意してからそれをもとにListを作成する、といった方法を取ることもできます。 次の例では、全要素数が100の配列を用意してからListを作成しています。
上記の例では、元になる配列arrと、それをもとに作成するlistの二つで個別にインスタンスが確保されている点に注意してください。
Listの要素数・容量に関して、後述の§.容量も合わせて参照してください。