これまでは基本的に一つの値を持つ変数を扱って、その値に処理をする方法を学んできたことになります。例えばint型やstring型、bool型は変数に対して1つの値しか持っていない状態でした。これに対して、配列は一つの変数に対して複数の値を持てるデータ構造をしています。
実際の現場では一つの変数に対して複数の値を持っているものに対して処理をすることが多いので、配列の考え方も重要になります。これまでとはデータ構造が違いますので、注意が必要かもしれません。
配列のデータ構造
イメージとしては住所に対して戸建てかアパートのようなイメージです。戸建ての場合は一つの住所に対して建物が一つですが、アパートでは一つの建物内に部屋が複数あり、それぞれが部屋番号を持っています。配列はアパートに近いイメージです。
これまで学んできたint型やstring型、bool型は左側の戸建てのイメージになります。配列は右側のアパートのイメージです。あまりイメージがわかないと思いますので、実際にサンプルコードを書いて説明していきます。
C#で配列を書く方法
では「配列」のサンプルコード記述していきます。配列も結局は一つのデータ型ですので、変数の宣言が必要になります。ただし、これまでとは少し異なる宣言方法になるので慣れるまで、何回か書いてみる必要があるかもしれません。
文字列型の配列を書く方法
さっそく、新規のコンソールアプリケーションを作成して以下を記述し、実行して処理内容を確認してみましょう。まずは簡単に文字列型の配列から作ってみます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App01
{
class Program
{
static void Main(string[] args)
{
//格納数3の配列を宣言する
string[] array = new string[3];
//配列に値を設定する
array[0] = "Tom";
array[1] = "John";
array[2] = "Bob";
//配列から取り出して表示する
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
Console.WriteLine(array[2]);
Console.ReadLine();
}
}
}
これまでと同様に配列を使用する際にも変数として宣言する必要があります。「string [] array = new string[3];」の部分が該当します。これは「string型を格納できるarrayという名前とし、string型の値を3個格納できる配列を使用します」という宣言です。” [ ] “が配列のキーワードだと思ってください。
配列の部屋番号(これをインデックスと呼びます)は、若い順に0から部屋が区切られています。ちょうど0号室、1号室、2号室となります。配列では格納可能な個数と格納されている部屋番の数が「1」ずれていることに注意が必要です。
また、配列の要素にアクセスするには「変数名[ 番号 ]」でアクセスできます。「Console.WriteLine(array[0]);」という記述の「array[0]」の部分が配列の要素にアクセスしている部分になります。string型を格納しているので、そのまま「Console.WriteLine()」に引き渡しています。
int型の配列を書く方法
string型の配列を書く方法を紹介してきましたので、つぎはint型の配列を書く方法を紹介していきます。先ほどの配列のサンプルから難しくして、for文を使用して動的に配列の中身を設定し、動的に配列の中身を取得するようにしています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App02
{
class Program
{
static void Main(string[] args)
{
int[] array = new int[10];
for (int i = 1; i <= 10; i++)
{
//配列に値を格納する
array[i - 1] = i;
Console.WriteLine("配列に値を格納:" + i.ToString());
}
Console.WriteLine("配列への値格納を完了!!");
Console.WriteLine();
//配列から値を取り出して表示する
for (int i = 0; i < 10; i++)
{
Console.WriteLine("配列の値を取得:" + array[i].ToString());
}
Console.WriteLine("配列からの値取得を完了!!");
Console.ReadLine();
}
}
}
配列の変数を宣言については先ほどと同様です。「int[] array = new int[10];」が該当します。「int[]」で「int型の配列を使用します」という意味になります。イコールの右側、「new int[10]」は「int型の配列で要素の格納数を10個にする」という意味です。
先ほども記述しましたが、配列の番号は要素の個数と比べて1ずれているので、配列に値を設定する時は「array[i – 1] = i;」と記述しました。for文では i が1から始まるので、「array[0] = 1;」となります。あとは i が2、3、4、と続きます。
配列の長さ「Length」を使う方法
配列はfor文と相性が良く使いやすいので、絡めて使う方法を覚えておくと便利になります。もう一つ、配列の要素数を取得できる方法を紹介したいと思います。「配列の長さ」を取得する方法になります。新規のコンソールアプリケーションを作成して以下を書いてみましょう。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App03
{
class Program
{
static void Main(string[] args)
{
string[] nameArray = new string[3];
nameArray[0] = "John";
Console.WriteLine(nameArray[0] + "を格納しました");
nameArray[1] = "Queen";
Console.WriteLine(nameArray[1] + "を格納しました");
nameArray[2] = "King";
Console.WriteLine(nameArray[2] + "を格納しました");
Console.WriteLine();
//配列の長さを取得する
int length = nameArray.Length;
Console.WriteLine("配列の長さ:" + length.ToString());
//名前を表示する
for (int i = 0; i < length; i++)
{
Console.WriteLine(nameArray[i]);
}
Console.ReadLine();
}
}
}
一番重要なのは「int length = nameArray.Length;」の部分です。「name.Array.Length;」を使用することで配列の長さを取得できます。現在は配列の格納数を3に設定しているので3が取得できます。「(変数名).Length」で情報を取得できますが、これを「プロパティ」と呼んでいます。
配列では「Length」プロパティを使用することで、配列全体の長さ、つまり「部屋数が何個あるか」を知ることが出来るようになっているのです。この情報をfor文の継続条件に当てはめたのが出力部分のfor文になります。
「for (int i = 0; i < length; i++)」のうち「i < length」の部分が該当します。変数lengthには、配列の長さである「3」が格納されています。この時、配列の長さに対して最大の要素のインデックスは2になります。ですので、継続条件としては「i が 3 より小さい場合」をループの繰り返しとしています。
Lengthプロパティを使用することで、配列の最大数が可変に代わるような場合でも、自動ですべての部屋にアクセスすることが可能になるのです。こうしたプロパティも使うことで、より便利に配列を使用できるようになります。
C#で配列を使う方法:まとめ
最後にC#で配列を使用する方法について、簡単にまとめて当記事を終了したいと思います。配列を使用する際には以下の法則で宣言する必要があります。
(型) (変数名)[] = new (型) [(格納数)];
少し複雑になっています。newキーワードについては、今の段階では触れておきません。いまは「配列を使用する際は new も使うんだったな・・・」と覚えておけば十分です。これはオブジェクト指向プログラミングで学びます。
また、配列の格納数と要素の番号(インデックス)はずれているので注意が必要です。個数は1個、2個、3個と数えますが、要素のインデックスは0、1、2となります。配列の長さを取得するには「Length」プロパティが使用できます。これは「(変数名).Length」で「配列が何部屋あるか」を知ることができます。