配列はプログラミングには欠かせない基本要素である。C#の配列型は、暗黙のうちにArrayクラスを継承しているため、多くの便利な機能を備えている。
本記事は、(株)技術評論社が発行する書籍『新プログラミング環境 C#がわかる+使える』から許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。
配列は、プログラミング言語の入門で学ぶ機会の多いポピュラーな機能といえる。C#でも配列が利用できるが、配列も一種のオブジェクトとして実現されているため、ほかのプログラミング言語と異なる使い方ができる場合がある。本章では、そのような特徴も含めてC#の配列を解説する。
ほかの多くのプログラミング言語と同様に、C#でも配列を使うことができる。配列は、同じデータ型あるいは共通の基底クラスを持つ多数のデータを集めたもので、個々のデータは添え字と呼ばれる番号を指定することで読み書きすることができる。まず、最も単純な一次元の配列から見てみよう。サンプル・ソースList 15-1は、10個の整数を持つ配列変数を使った例である。
1: using System;
2:
3: namespace Sample001
4: {
5: class Class1
6: {
7: [STAThread]
8: static void Main(string[] args)
9: {
10: int [] ar = new int[10];
11: for( int i=0; i<10; i++ )
12: {
13: ar[i] = i;
14: }
15: for( int i=0; i<10; i++ )
16: {
17: Console.WriteLine( ar[i] );
18: }
19: }
20: }
21: }
これを実行するとFig.15-1のようになる。
配列変数は、13行目や17行目のように、角括弧([])によって添え字をくくって記述する。配列変数の宣言は10行目にあるとおりである。まず、最初のintは整数型であることを示す。そして、次の[]が配列であることを示す。この2つを合わせた「int []」は、整数型の配列というデータ型を表す。そして、次に記述されたarは配列になるべき変数名である。ここまでの順番は、「int [] 変数名」であって、「int 変数名 []」ではないことに注意していただきたい。角括弧は、読み書きに使うときには変数名の後に付くが、宣言時には変数名の手前にくる。さて、次のイコール(=)は、変数に初期値を代入することを意味している。初期値といっても配列に入れる値ではなく、配列インスタンスそのものを入れる。C#では配列も一種の参照型のインスタンスなのである。そのため、newキーワードを用いて、新しいインスタンスを生成することを示す。そして、その後に作成する配列のデータ型を記述する。ここでは整数なので、キーワードintを記述している。それだけでは配列の生成にならないので、その後にさらに角括弧を続け、配列型であることを示す。角括弧の中には、要素の数を記述する。ここでは10を記述している。
以上を要約すれば、10行目で行われることは、整数型の配列変数であるarを宣言することと、それに初期値として、整数型で10個の値を入れることができる配列のインスタンスを作成して代入することである。
ほかの部分は難しくはないので簡単に説明する。13行目は、配列変数arのi番目の要素に、iの値を代入している。17行目は、配列変数arのi番目の要素を取り出して、これを出力している。
基本的に、既存のプログラミング言語のプログラマーが引っかかりそうな箇所は宣言と初期化だけで、あとは悩むことはないだろう。
C#では、一次元だけでなく二次元の配列もできる。List 15-2がそのサンプル・ソースである。
1: using System;
2:
3: namespace Sample002
4: {
5: class Class1
6: {
7: [STAThread]
8: static void Main(string[] args)
9: {
10: int [,] ar = new int[10,10];
11: for( int i=0; i<10; i++ )
12: {
13: for( int j=0; j<10; j++ )
14: {
15: ar[i,j] = i*j;
16: }
17: }
18: for( int i=0; i<10; i++ )
19: {
20: for( int j=0; j<10; j++ )
21: {
22: Console.Write( ar[i,j] );
23: Console.Write( " " );
24: }
25: Console.WriteLine();
26: }
27: }
28: }
29: }
これを実行するとFig.15-2のようになる。
ここで注目すべきは10行目である。一次元の場合と違う箇所は2つある。1つは、intの次が「[ , ]」となっている点である。カンマによって2つの添え字が記述可能であることが暗示されている。次に注目すべき箇所はこの行の後半にある。配列のサイズを示す記述が「[10,10]」と2つの値に増えている。これは、最初の添え字が10個、次の添え字が10個の、計100個の要素を持つ二次元配列を指定している。
配列へのアクセスを行う場合も、15行目や22行目のように、各括弧内の添え字をカンマで区切って行う。
同様に三次元配列も可能である。List 15-3にそのサンプル・ソースを示す。
1: using System;
2:
3: namespace Sample003
4: {
5: class Class1
6: {
7: [STAThread]
8: static void Main(string[] args)
9: {
10: int [,,] ar = new int[3,3,3];
11: for( int i=0; i<3; i++ )
12: {
13: for( int j=0; j<3; j++ )
14: {
15: for( int k=0; k<3; k++ )
16: {
17: ar[i,j,k] = i*j*k;
18: }
19: }
20: }
21: for( int i=0; i<3; i++ )
22: {
23: for( int j=0; j<3; j++ )
24: {
25: for( int k=0; k<3; k++ )
26: {
27: Console.Write( ar[i,j,k] );
28: Console.Write( " " );
29: }
30: Console.WriteLine();
31: }
32: Console.WriteLine();
33: }
34: }
35: }
36: }
これを実行するとFig.15-3のようになる。
基本的に角括弧内の区切りのカンマが増えただけでプログラム内容そのものは、二次元の場合と同じである。詳しい説明は必要ないだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.