コレクション【C#】

C#文法:コレクション:B03_生成と同時に値を設定する

前回は、new int[10]のように要素数を指定して配列を生成し、そのあとでインデックスを指定して1つずつ値を設定しました。今回は、配列を生成するのと同時に、最初から値を入れておく書き方を見ていきます。

図1 今回のテーマ「生成と同時に値を設定する」

テスト用のボタンを追加する

まず、前回作成した「配列の生成」ボタンの下に、新しくボタンを1つ追加します。ボタンのTextは「生成と同時に値を設定する」としておきます。

図2 フォームにボタンを追加する

追加したボタンをダブルクリックすると、クリックイベントのメソッドbutton2_Clickが自動生成されます。今回のコードは、このメソッドの中に書いていきます。何をしている箇所なのかが後からわかるように、先頭にコメントを入れておきます。

リスト1 button2_Clickにコメントを入れる

private void button2_Click(object sender, EventArgs e)
{
    //生成と同時に値を設定する
}

 

 

図3 自動生成されたbutton2_Clickにコメントを書いたところ

前回の書き方をおさらいする

比較のために、前回の書き方をもう一度書いておきます。型のあとに角括弧を付けたint[]が「intの配列」という型で、右辺のnew int[10]で要素数10の配列を生成しているのでした。

リスト2 前回の書き方(要素数を指定して生成)

//生成と同時に値を設定する
int[] haiA = new int[10];

 

 

図4 前回と同じ書き方でhaiAを生成する

この書き方では、配列の入れ物が10個用意されるだけで、値はあとからhaiA[0] = 11;のように1つずつ設定する必要があります。

中括弧で値を並べて生成する

値を設定しながら生成する場合も、途中までは同じです。int[] haiB = new int[まで書いたら、前回は配列の数を設定していた角括弧の中を、何も書かずに閉じます。

図5 角括弧の中に要素数を書かずに閉じる

そして、その後ろに中括弧を付けて、カンマ区切りで値を並べます。

リスト3 生成と同時に値を設定する

int[] haiA = new int[10];
int[] haiB = new int[] { 11, 22, 33, 44 };

 

図6 中括弧の中にカンマ区切りで値を並べる

ここでは値を4個書いたので、配列としては要素数4で生成されます。要素数は書いた値の数から自動的に決まるため、角括弧の中に数を書く必要がありません。そして値は書いたとおり、11、22、33、44が最初から入った状態で配列が生成されます。

実行して確かめてみましょう。メソッドの終わりにブレークポイントを置いて実行し、「生成と同時に値を設定する」ボタンをクリックします。止まったところでhaiBにマウスカーソルを合わせると、データヒントに{int[4]}と表示され、展開するとインデックス0から3まで、指定したとおりの値が入っていることが確認できます。

図7 haiBは要素数4で、指定した値が最初から入っている

前回の書き方で同じ状態を作ろうとすると、次のように生成と値の設定を別々に書くことになります。リスト3のhaiBの1行は、これと同じ結果になります。

リスト4 同じ状態を前回の書き方で作った場合(比較用)

int[] haiB = new int[4];
haiB[0] = 11;
haiB[1] = 22;
haiB[2] = 33;
haiB[3] = 44;

左辺をvarにする

ほかの書き方として、左辺をvarにすることもできます。右辺にnew int[]と書いてあるので、コンパイラはhaiCの型がint[]であると推論できます。

リスト5 左辺をvarにする

int[] haiB = new int[] { 11, 22, 33, 44 };
var haiC = new int[] { 11, 22, 33, 44 };

 

図8 左辺をvarにしたhaiC

これで実行しても、haiBと同じ結果になります。haiCの型はint[]で、要素数は4、値は11、22、33、44です。

右辺の型を省略する

逆に、右辺の型を消すこともできます。haiBの行をコピーして見比べてみると、new int[]の部分の文字が薄く表示されています。これは、Visual Studioが「この部分は省略できますよ」と教えてくれている表示です。

図9 new int[]の部分が薄く表示され、省略できることを示している

このnew int[]の部分を消して、中括弧だけを残してもOKです。

リスト6 右辺の型を省略する

int[] haiD = { 11, 22, 33, 44 };

 

図10 右辺を中括弧だけにしたhaiD

左辺にint[]、つまり「intの配列だよ」と書いておけば、右辺は中括弧で囲って、その型の値をカンマ区切りで入れておけばよい、ということです。実行してhaiDを確認すると、これもまったく同じ結果になっています。

図11 haiDも要素数4で、同じ値が入っている

ここまでの3つの書き方を並べると、次のようになります。どれも生成される配列は同じです。

リスト7 生成と同時に値を設定する3つの書き方

int[] haiB = new int[] { 11, 22, 33, 44 };   //基本の書き方
var haiC = new int[] { 11, 22, 33, 44 };     //左辺をvarにする
int[] haiD = { 11, 22, 33, 44 };             //右辺の型を省略する

 

なお、左辺のvarと右辺の型の省略を同時に行うことはできません。var haiX = { 11, 22, 33, 44 };と書くと、左辺にも右辺にも型の情報がなくなり、コンパイラが型を決められないためコンパイルエラーになります。型は左辺か右辺の少なくともどちらかに書く、と覚えておいてください。

違う型の値は入れられない

ちなみに、配列には違う型の値を入れることはできません。試しにint[]の配列の4個目に、文字列の””を入れてみます。

リスト8 int型の配列に文字列を入れようとする(コンパイルエラー)

int[] haiE = { 11, 22, 33, "" };   //コンパイルエラー

 

 

図12 4個目に文字列を入れると赤い波線が表示される

“”の部分に赤い波線が表示され、コンパイルエラーになります。int[]は「intの配列」なので、入れられるのはintの値だけです。

数値と文字列の両方を入れたいのであれば、配列の型をobject[]にすれば入れることができます。同様に、文字列だけを入れる配列であればstring[]にします。

図13 配列の型をobject[]にすれば、エラーは消える

リスト9 型に合わせた値を入れる

object[] haiE = { 11, 22, 33, "" };       //objectの配列なら何でも入れられる
string[] haiF = { "A", "B", "C" };        //stringの配列には文字列だけ

 

ただし、int[]と書いているのであれば、入れられるのはintだけです。これは今回見てきたどの書き方でも同じで、haiBやhaiCのように右辺にnew int[]と書いている場合も、中括弧の中に違う型の値を入れるとエラーになります。

図14 ほかの書き方でも、違う型の値を入れるとエラーになる

サンプルコードには、違う型はNGであることがわかるように、コメントとして残しておきます。

リスト10 button2_Clickの完成形

private void button2_Click(object sender, EventArgs e)
{
    //生成と同時に値を設定する
    int[] haiA = new int[10];
    int[] haiB = new int[] { 11, 22, 33, 44 };
    var haiC = new int[] { 11, 22, 33, 44 };
    int[] haiD = { 11, 22, 33, 44 };
 
    //違う型はNG
    //int[] haiE = { 11, 22, 33, "" };
}

まとめ

配列を生成するときは、角括弧の中の要素数を省略して、後ろに中括弧を付け、カンマ区切りで値を並べることで、最初から値が入った状態の配列を生成できます。左辺をvarにする書き方と、右辺のnew int[]を省略する書き方もあり、どれも結果は同じです。

図15 今回紹介した3つの書き方

最初から値を入れた状態で配列を生成したい場合は、こういった書き方でやってみてください。

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新機能」を観る