コレクション【C#】

C#文法:コレクション:B02_配列の生成とアクセス

このレクチャーでは、C#で配列を生成する方法と、生成した配列の要素に値を設定・アクセスする方法を解説します。配列はコレクションの中でもっとも基本となるデータ構造で、この後に登場するList<T>も内部では配列を使って実装されています。ここでしっかり基本を押さえておきましょう。

図1 B02_配列の生成とアクセス

1. 検証用のボタンを用意する

事前に作成しておいたWindows Formsのプロジェクト(WinFormsApp1)を使います。Form1のデザイン画面を開き、ツールボックスからButtonをドラッグしてフォーム上に配置します。

図2 ツールボックスからButtonを選択する

配置したボタンを選択した状態でプロパティウィンドウを開き、Textプロパティを「配列の生成」に変更します。

図3 TextプロパティにButtonの表示名「配列の生成」を設定

ボタンをダブルクリックすると、Clickイベントのハンドラーであるbutton1_Clickメソッドが自動生成され、コードエディターに切り替わります。以降のコードはすべてこのメソッドの中に書いていきます。

図4 ダブルクリックで生成されたbutton1_Clickメソッド

リスト1 Form1.cs(自動生成されたイベントハンドラー)

private void button1_Click(object sender, EventArgs e)
{
    //配列の生成
}

 

2. 配列の書き方は「型+[]」

配列の型は、「配列にしたい型」の後ろに角括弧[]を付けて表します。たとえばintの配列を作りたいのであればint[]、stringの配列であればstring[]となります。

図5 配列の型は「型+[]」で表す

リスト2 配列型の書き方

int[]    // intの配列
string[] // stringの配列

3. 要素の数を指定して生成する

配列は基本的に、生成するときに要素の数を決めておく必要があります。new int[10]のように、角括弧の中に要素数を指定します。これで「int型の値を10個格納できる領域」が確保されます。変数名はhaiAとしました。

図6 new int[10]で要素数10の配列を生成

リスト3 要素数10のint配列を生成する

private void button1_Click(object sender, EventArgs e)
{
    //配列の生成
    int[] haiA = new int[10];
}

 

4. 実行して中身を確認する

メソッドの閉じ括弧の行にブレークポイントを置き、実行して「配列の生成」ボタンをクリックします。ブレークで止まったらhaiAにマウスカーソルを合わせると、データヒントに{int[10]}と表示され、10個分の領域ができていることが確認できます。

図7 データヒントでhaiAが{int[10]}であることを確認

展開して中身を見ると、ここで注意すべき点が分かります。インデックスは[0]から始まり、[9]で終わっています。0〜9で合計10個です。つまり、配列のインデックスは0始まり(ゼロインデックス)で、最後の要素のインデックスは「要素数-1」になります。

図8 インデックスは[0]から始まり[9]で終わる

また、まだ何も値を設定していないにもかかわらず、各要素には0が入っています。配列をnewで生成すると、各要素はその型の既定値(intなら0、参照型ならnull)で初期化されるためです。

5. 左辺はvarでもよい

右辺のnew int[10]から型が明らかなので、左辺の型はvarで書くこともできます。var haiB = new int[10];はint[] haiB = new int[10];とまったく同じ意味になります。

図9 左辺をvarにしたhaiB

リスト4 左辺をvarにした書き方

//配列の生成
//要素の数を指定する
int[] haiA = new int[10];
//左辺はvarでもよい
var haiB = new int[10];

 

6. 値の設定とアクセス

配列の要素への値の設定や取り出しは、変数名[インデックス]の形で行います。先ほど確認したとおりインデックスは0始まりなので、1個目の要素は[0]、2個目は[1]、3個目は[2]となります。

リスト5 インデックスを指定して値を設定する(完成コード)

private void button1_Click(object sender, EventArgs e)
{
    //配列の生成
    //要素の数を指定する
    int[] haiA = new int[10];
    //左辺はvarでもよい
    var haiB = new int[10];
 
    //値の設定:ゼロインデックス始まり
    haiA[0] = 11;
    haiA[1] = 21;
    haiA[2] = 31;
}

 

 

図10 値の設定はゼロインデックス始まり

実行してブレークポイントで止め、haiAの中身を確認します。[0]に11、[1]に21、[2]に31が入り、値を設定していない[3]以降は0のままになっていることが分かります。

図11 [0]〜[2]に11・21・31が設定されている

値を読み出す場合も同じく変数名[インデックス]で取得できます。また、インデックスに範囲外の値(このケースでは10以上や負の値)を指定すると、実行時にIndexOutOfRangeExceptionが発生します。0始まりであることを意識し、最後の要素は「要素数-1」であることに注意しましょう。

リスト6 (参考)値の取得と範囲外アクセス

//値の取得(アクセス)
int value = haiA[1];        // 21
 
//最後の要素は「要素数-1」
int last = haiA[9];         // 0(未設定なので既定値)
 
//範囲外を指定すると実行時に例外
//int error = haiA[10];     // IndexOutOfRangeException

 

まとめ

配列の型は「型+[]」で表し、new int[10]のように生成時に要素の数を指定します。左辺はvarで書いても同じ意味になります。生成直後の各要素は型の既定値で初期化されています。

値の設定やアクセスはインデックスで行い、インデックスは0から始まって「要素数-1」で終わります。この「ゼロインデックス始まり」は配列に限らず、この後に学ぶList<T>など多くのコレクションに共通するルールなので、しっかり覚えておきましょう。

C#文法:コレクション

■非公開コース「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新機能」を観る