ここからは、配列でよく使う機能を順番に見ていきます。前のレクチャーで確認したとおり、配列はすべてArrayクラス(抽象クラス)から派生しており、Length、IndexOf、Copyといった機能はArrayクラスが提供しています。まずは、もっとも基本となるLengthから始めましょう。
これまでと同じ要領で、フォームに「Length」というボタンを追加し、ダブルクリックしてクリックイベントのメソッドを生成します。
図1 Arrayクラスの機能のひとつであるLength。フォームに「Length」ボタンを追加する
Lengthは要素の数を返すプロパティ
Lengthは、配列の要素の数を返してくれるプロパティです。intの配列を用意して、Lengthを取得してみます。
リスト1 Lengthで要素の数を取得する
//Length
private void button5_Click(object sender, EventArgs e)
{
int[] hai = [ 11, 22, 33, 99 ];
var len = hai.Length;
}
hai.Lengthにマウスカーソルを合わせると、int Array.Length { get; }と表示されます。Arrayクラスに定義された、取得専用(getのみ)のint型のプロパティであることがわかります。
図2 Lengthにカーソルを合わせると、Arrayクラスのプロパティであることが表示される
ブレークポイントを置いて実行し、値を確認してみましょう。
図3 hai.Lengthの値は4になっている
4になっています。11、22、33、99の4個なので、要素の数が正しく取得できています。
先頭と末尾の要素を取り出す
Lengthの使いどころのひとつが、末尾の要素の取得です。配列の先頭の要素は、0番目なのでhai[0]で取得できます。では、末尾の要素はどうでしょうか。
Lengthは4ですが、インデックスは0、1、2、3と0から始まるため、末尾の要素のインデックスは3です。つまり、Length - 1を指定すれば、いちばん後ろの要素が取得できます。
リスト2 先頭と末尾の要素を取得する
int[] hai = [ 11, 22, 33, 99 ]; var len = hai.Length; var start = hai[0]; // 先頭の要素 var end = hai[hai.Length - 1]; // 末尾の要素(Length - 1 番目)
実行して確認すると、endには99、startには11が入っています。
図4 endには末尾の要素である99が入っている
図5 startには先頭の要素である11が入っている
hai[3]のように数字を直接書いてしまうと、要素の数が変わったときに修正が必要になります。hai[hai.Length - 1]と書いておけば、要素がいくつであっても常に末尾の要素を指すことができます。
foreachで回す場合はLengthを使わない
Lengthのもうひとつの使いどころが、forで配列を回すときです。その前に、比較のためにforeachを見ておきます。foreachの場合はLengthを使いません。
リスト3 foreachで配列を回す
foreach (var val in hai)
{
System.Diagnostics.Debug.WriteLine(val);
}
foreachで配列を回すと、先頭から順番に要素が取り出されます。実行して出力ウィンドウを確認すると、11、22、33、99の順に出力されています。
図6 foreachで回すと、11、22、33、99の順に出力される
forで回す場合はLengthを条件に使う
forを使う場合は、次のように書きます。intのiを宣言して0から始め、iが配列のLengthより小さい間、繰り返します。Lengthは4なので、iは0から3まで回ることになります。
リスト4 forで配列を回す
System.Diagnostics.Debug.WriteLine("----------------");
for (int i = 0; i < hai.Length; i++)
{
System.Diagnostics.Debug.WriteLine(hai[i]);
}
ループの中では、hai[i]とインデックスを指定することで、各要素を取得できます。なお、foreachの出力と見分けがつくように、間に区切り文字を出力しています。
図7 条件にhai.Lengthを使い、hai[i]で要素を取得する
条件をi <= hai.Lengthと書いてしまうと、存在しないhai[4]にアクセスして例外になります。「Lengthより小さい間」と覚えておきましょう。
図8 区切り文字の後に、foreachと同じく11、22、33、99が出力される
foreachと同じように、1個目から4個目までが順番に出力されました。
forのポイントは条件が書けること
foreachは先頭から順番に回すだけですが、forは条件を自分で書くことができます。そのため、1個飛ばしで回したり、何番目から何番目まで、というようにピンポイントで回したりすることができます。
リスト5 (参考)1個飛ばし・範囲指定で回す
// 1個飛ばし(0番目、2番目)
for (int i = 0; i < hai.Length; i += 2)
{
System.Diagnostics.Debug.WriteLine(hai[i]); // 11, 33
}
// 1番目から2番目まで
for (int i = 1; i <= 2; i++)
{
System.Diagnostics.Debug.WriteLine(hai[i]); // 22, 33
}
逆回し
forでよく使うのが「逆回し」です。開始位置をhai.Length - 1、つまり末尾の3にして、iが0以上の間、iをデクリメント(1ずつ減らす)していきます。3、2、1、0と減っていくので、末尾から先頭に向かって回ることになります。
リスト6 forで逆回しにする
System.Diagnostics.Debug.WriteLine("----------------");
for (int i = hai.Length - 1; i >= 0; i--)
{
System.Diagnostics.Debug.WriteLine(hai[i]);
}
図9 開始位置をhai.Length – 1、条件をi >= 0、更新をi–にする
実行すると、99、33、22、11と、逆順に出力されていることが確認できます。
図10 99、33、22、11と逆順に出力される
逆回しは要素を削除するときに使う
逆回しは、リストの中身を削除するときによく使われます。先頭から順番に回しながら削除していくと、インデックスがずれてしまうからです。どういうことか、順を追って見ていきましょう。
インデックスが0、1、2、3の4つの要素があり、このうち1と3を削除したいとします。
図11 先頭から回す場合。インデックス1の要素(22)を削除しようとしている
先頭から回すと、最初の0は対象外なので何もしません。次の1は削除対象なので削除します。すると、後ろの要素が前に詰められて、インデックスがずれてしまいます。
図12 1を削除すると後ろが詰められ、33が1番目、99が2番目にずれる
もともと3番目だった99は、2番目に移動しています。このまま2、3と見ていくと、消したかった99は消せず、さらに「3番目がない」というエラーになったりします。
そうならないために、逆回しで削除します。末尾の3から3、2、1、0の順に回します。
図13 逆回しの場合。3番目(99)と1番目(22)が削除対象
まず3を削除します。末尾を消しただけなので、それより前の要素のインデックスは変わりません。2はスキップし、1を削除します。このとき後ろの要素のインデックスはずれますが、そこはもう通り過ぎた場所なので影響がありません。最後の0はスキップして終了です。
図14 狙いどおり1と3が削除され、11と33が残る
これで、狙いどおり1と3の要素を削除できました。
配列は要素数が固定なので、実際にこの削除を行うのは、後のセクションで扱うList<T>などになります。List<T>ではLengthの代わりにCountを使いますが、考え方はまったく同じです。参考として、コードにすると次のようになります。
リスト7 (参考)List<T>で逆回しをしながら削除する
var list = new List<int> { 11, 22, 33, 99 };
// 末尾から先頭に向かって回す
for (int i = list.Count - 1; i >= 0; i--)
{
if (i == 1 || i == 3)
{
list.RemoveAt(i); // 削除しても、これから見る要素のインデックスはずれない
}
}
// list の中身は 11, 33
まとめ
Lengthは、配列の要素の数を返すプロパティです。末尾の要素を取得するhai[hai.Length - 1]、forで回すときの条件i < hai.Length、そして逆回しの開始位置hai.Length - 1と、さまざまな場面で登場します。特に逆回しは、要素を削除するときの定番の書き方ですので、ぜひ使ってみてください。
■非公開コース「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新機能」を観る






![図7 条件にhai.Lengthを使い、hai[i]で要素を取得する](https://anderson02.com/wp-content/uploads/2026/10/collection-b06-fig07.jpg)






