今回はResizeを取り上げます。配列のサイズ(要素数)をあとから変更する方法です。
配列は本来、最初に要素数を決めて、そのまま使い続けるのが基本的な使い方です。サイズを変えること自体はできますが、増減のたびに新しいサイズを指定してあげなければならず、なかなか手間がかかります。その「できるけれど面倒」という感覚も含めて、実際にコードを書いて確認していきましょう。
Resizeボタンを追加する
これまでのレクチャーと同じように、フォームのデザイン画面にボタンを1つ追加し、Textを「Resize」にします。
図1 フォームに「Resize」ボタンを追加する
追加したボタンをダブルクリックすると、クリックイベントのメソッド(ここではbutton12_Click)が生成されます。最初に、今回やることをコメントで書いておきます。
リスト1 生成されたイベントハンドラーにコメントを書く
private void button12_Click(object sender, EventArgs e)
{
//配列のリサイズ
//増減のたびに手間がかかる
}
図2 button12_Clickメソッドにコメントを書いたところ
リサイズ対象の配列を用意する
まずはデータとなる配列を用意します。intの配列を要素数3で生成し、同時に10、20、30を設定します。
リスト2 要素数3のint配列を生成する
//配列のリサイズ
//増減のたびに手間がかかる
int[] hai = new int[3] { 10, 20, 30 };
図3 要素数3の配列haiを生成する
Array.Resizeでサイズを変更する
配列のサイズを変更するときは、ArrayクラスにあるResizeメソッドを使います。Array.Resize(まで入力すると、次のようなシグネチャが表示されます。
リスト3 Array.Resizeのシグネチャ
void Array.Resize<T>(ref T[]? array, int newSize)
第1引数には、リサイズしたい配列をrefを付けて渡します。第2引数のnewSizeには、変更後の要素数、つまり「何個にするか」を指定します。
図4 Array.Resizeの引数に配列と新しいサイズを指定する
いまの配列は3個なので、4と指定すれば4個になります。
リスト4 新しいサイズを数値で直接指定する
int[] hai = new int[3] { 10, 20, 30 };
Array.Resize(ref hai, 4); //3個 → 4個になる
ただし、この書き方では「いま3個だから4」と、現在の要素数を自分で把握していなければなりません。「1個追加したい」という場合は、配列のLengthに+ 1した値を指定しておけば、現在の要素数を意識せずに済みます。
リスト5 Length + 1 で「1個追加」を表現する
int[] hai = new int[3] { 10, 20, 30 };
Array.Resize(ref hai, hai.Length + 1);
図5 新しいサイズをhai.Length + 1に書き換える
追加した要素にアクセスする
増やした要素は配列の一番最後に追加されます。配列のインデックスは0始まりなので、最後の要素のインデックスは「Length - 1」になります。ここも3のような数値を直接書くのではなく、hai.Length - 1と書いておけば、サイズがいくつであっても最後の要素を指すことができます。
リスト6 追加した最後の要素に値を設定する
//配列のリサイズ
//増減のたびに手間がかかる
int[] hai = new int[3] { 10, 20, 30 };
Array.Resize(ref hai, hai.Length + 1);
hai[hai.Length - 1] = 999;
図6 最後の要素に999を設定するコードまで書いたところ
実行して確認する
Array.Resizeの行にブレークポイントを置いて実行し、「Resize」ボタンを押します。ウォッチウィンドウにhaiを追加して中身を見ると、Resizeを実行する前の時点では{int[3]}、つまり3個の配列になっています。
図7 Resize実行前。haiは要素数3で、10・20・30が入っている
ここで1行進めてArray.Resizeを実行すると、{int[4]}に変わり、要素が4個になります。新しく増えた一番最後の要素[3]には、intのデフォルト値である0が入っています。もともとの10、20、30はそのまま残っています。
図8 Resize実行後。要素数が4になり、[3]にはデフォルト値の0が入っている
さらに1行進めて値を代入すると、インデックス3番目の要素に999が入っていることが確認できます。
図9 hai[hai.Length – 1]に999が設定された
追加については、このように「Resizeでサイズを増やす」→「増えた最後の要素に値を入れる」という2段階の手順になります。
削除の場合
ここまでは追加を見てきましたが、削除の場合はどうでしょうか。コードの下にコメントで整理しておきます。
リスト7 削除の場合の考え方をコメントで整理する
//削除の場合 //最後の要素を消すだけなら、サイズを縮めればよい //途中を削除する場合は、中身をずらして、サイズを縮めないといけないため //さらに面倒になる
図10 削除の場合の考え方をコメントに書く
最後の要素を消すだけなら、サイズを縮めれば済みます。同じResizeの書き方で2などと指定すれば、3個だったものが2個になる、4個だったものが2個になる、というように後ろから切り捨てられます。
リスト8 最後の要素を削除する(サイズを縮める)
int[] hai = new int[3] { 10, 20, 30 };
//サイズを2にする → 10, 20 だけが残る
Array.Resize(ref hai, 2);
//「最後の1個を消す」と書くなら
//Array.Resize(ref hai, hai.Length - 1);
問題は、一番後ろではなく途中の要素を消したい場合です。Resizeにできるのはサイズの変更だけなので、消したい位置より後ろの要素をすべて前に詰めてきて、結局最後の要素を消す、という手順を踏むことになります。たとえば、以前のレクチャーで扱ったArray.Copyを使うと次のようになります。
リスト9 途中の要素を削除する例(後ろを前に詰めてからサイズを縮める)
int[] hai = new int[4] { 10, 20, 30, 40 };
int removeIndex = 1; //20を削除したい
//removeIndexより後ろの要素を、1つずつ前に詰める
//→ 10, 30, 40, 40
Array.Copy(hai, removeIndex + 1,
hai, removeIndex,
hai.Length - removeIndex - 1);
//最後の要素を切り捨てる
//→ 10, 30, 40
Array.Resize(ref hai, hai.Length - 1);
要素を1つ消すだけでこれだけのコードが必要になるので、非常に面倒です。
サイズ変更がある場合はList<T>を使う
このように、配列でもサイズの変更はできますが、追加にも削除にも手間がかかります。そのため、基本的にはサイズの変更がある場合は、次回以降のレクチャーで解説するList<T>などのリスト系のクラスを使うのがよいでしょう。最後にその旨をコメントに残しておきます。
図11 「サイズ変更がある場合はList<T>を使用する」というコメントを追加
まとめ
今回のコード全体は次のとおりです。
リスト10 button12_Click(Resize)の完成コード
private void button12_Click(object sender, EventArgs e)
{
//配列のリサイズ
//増減のたびに手間がかかる
int[] hai = new int[3] { 10, 20, 30 };
Array.Resize(ref hai, hai.Length + 1);
hai[hai.Length - 1] = 999;
//削除の場合
//最後の要素を消すだけなら、サイズを縮めればよい
//途中を削除する場合は、中身をずらして、サイズを縮めないといけないため
//さらに面倒になる
//サイズ変更がある場合は、次回解説するList<T>を使用する
}
配列のサイズはArray.Resize(ref 配列, 新しいサイズ)で変更できます。1個追加するならLength + 1を指定し、追加した要素にはLength - 1のインデックスでアクセスします。増えた要素にはデフォルト値が入ります。
一方で、最後の要素の削除はサイズを縮めるだけで済むものの、途中の削除は要素を詰める処理が必要になり、さらに面倒です。配列は「最初に数を決めてそのまま使う」のが基本であり、サイズ変更がある場合はList<T>を使う、と覚えておいてください。
■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る
A01_はじめに
A02_プロジェクトの作成
B01_配列とは
B02_配列の生成とアクセス
B03_生成と同時に値を設定する
B04_型推論による生成
B05_メソッドの引数などにする場合の注意点
B06_Length
B07_IndexOfでの検索
B08_FindIndexでの検索
B09_Find
B10_Exists
B11_FindAllとFindLast
B12_誤ったコピー
B13_Array.Copy
B14_範囲指定のコピー
B15_Resize
C01_ArrayList
C02_List
C03_List 動的な要素の変更
C04_Listのコンストラクタ
C05_Listのコンストラクタ_Capacity
C06_ListTからArrayクラスのメソッドが呼ばれている
D01_コレクションインタフェースとは
D02_異なるコレクションクラスに互換性を持たせる
D03_インタフェースの階層構造
D04_クライアントができる操作を制限させる
D05_クライアントができる操作を制限させる_後半
D06_Enumerableの拡張メソッドに関して
D07_ReadOnly系のコレクションインタフェース
D08_AsReadOnly
D09_ToListでコピーする
D10_ListTはprivateで使う
■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る







![図8 Resize実行後。要素数が4になり、[3]にはデフォルト値の0が入っている](https://anderson02.com/wp-content/uploads/2026/10/collection-b15-fig08.jpg)
![図9 hai[hai.Length - 1]に999が設定された](https://anderson02.com/wp-content/uploads/2026/10/collection-b15-fig09.jpg)

