毎度、ここから。
public bool Remove(T item) {
int index = IndexOf(item);
if (index >= 0) {
RemoveAt(index);
return true;
}
return false;
}T型のitemを引数にとる。IndexOfは線形探索で、itemの要素があった場合、最初のインデックスを返す。indexが0以上の値だった場合は、RemoveAt()メソッド用いて削除する。public void RemoveAt(int index) {
if ((uint)index >= (uint)_size) {
ThrowHelper.ThrowArgumentOutOfRangeException();
}
Contract.EndContractBlock();
_size--;
if (index < _size) {
Array.Copy(_items, index + 1, _items, index, _size - index);
}
_items[_size] = default(T);
_version++;
}_sizeから1を引いている。indexの番号が、_sizeよりも大きいかチェックする。index + 1から最後の要素までを、indexを先頭にコピーしている。つまり、削除される要素の1個後ろの要素からすべての要素を1個前に詰めている。要素数が多い場合は、計算量が増える。さらに言えば、後ろの要素を削除するより、先頭の方の要素を削除する方が、コストが大きい。_items[_size]にはT型の規定値を代入する。RemoveAt()メソッドは、かなりコストが大きい。capacityに大きな値を指定したからと言ってRemoveのパフォーマンスには影響しない。(要素自体は確保されているので、メモリは使用されるが)