C#配列の使い方を初心者向けに解説|宣言・初期化・要素の追加・ループ処理まで

はじめに

C#で複数のデータをまとめて扱いたいときに便利なのが「配列」です。配列を使えば、同じ型の値を1つの変数にまとめて保存し、番号を指定して取り出したり、ループ処理で順番に操作したりできます。

たとえば、3人分の点数を個別の変数で管理する場合、次のように記述できます。

C#
int score1 = 80;
int score2 = 90;
int score3 = 75;

人数が少なければ問題ありませんが、100人分の点数を扱う場合は、100個の変数を用意しなければなりません。そこで配列を使うと、複数の点数を1つの変数にまとめられます。

C#
int[] scores = { 80, 90, 75 };

この記事では、C#の配列について、宣言や初期化、要素の取得・変更、要素の追加、ループ処理まで初心者向けに解説します。

1. C#の配列とは

C#の配列とは、同じデータ型の値を複数まとめて管理するための仕組みです。

整数を保存する配列には整数だけ、文字列を保存する配列には文字列だけを格納します。基本的に、異なるデータ型の値を同じ配列へ混在させることはできません。

C#
int[] numbers = { 10, 20, 30 };
string[] names = { "田中", "佐藤", "鈴木" };

配列の各データは「要素」と呼ばれます。要素には「インデックス」と呼ばれる番号が割り当てられており、インデックスを指定することで特定の要素へアクセスできます。

C#の配列では、インデックスが0から始まる点に注意が必要です。

C#
string[] names = { "田中", "佐藤", "鈴木" };

Console.WriteLine(names[0]); // 田中
Console.WriteLine(names[1]); // 佐藤
Console.WriteLine(names[2]); // 鈴木

3つの要素を持つ配列の場合、使用できるインデックスは0、1、2です。names[3]のように存在しないインデックスを指定すると、実行時にIndexOutOfRangeExceptionが発生します。

配列を宣言する方法

C#で配列を宣言する基本構文は次のとおりです。

C#
データ型[] 配列名;

整数型の配列を宣言する場合は、次のように記述します。

C#
int[] numbers;

文字列型の配列であれば、次のようになります。

C#
string[] names;

この時点では配列の変数を宣言しただけで、配列本体は作成されていません。実際に使用するには、newを使って配列を生成する必要があります。

C#
int[] numbers = new int[3];

new int[3]は、整数を3つ保存できる配列を生成する記述です。

配列を初期化する方法

配列を宣言するときに、要素数を指定して初期化できます。

C#
int[] numbers = new int[3];

値を指定していない要素には、データ型に応じた初期値が自動的に設定されます。主な初期値は次のとおりです。

データ型初期値
int0
double0.0
boolfalse
stringnull

次のコードでは、3つの要素すべてに0が格納されています。

C#
int[] numbers = new int[3];

Console.WriteLine(numbers[0]); // 0
Console.WriteLine(numbers[1]); // 0
Console.WriteLine(numbers[2]); // 0

配列の宣言と同時に値を設定することも可能です。

C#
int[] numbers = new int[] { 10, 20, 30 };

値を記述する場合、要素数の指定は省略できます。

C#
int[] numbers = new int[] { 10, 20, 30 };

さらに、new int[]も省略して簡潔に記述できます。

C#
int[] numbers = { 10, 20, 30 };

C#では、次の書き方がシンプルでよく使われます。

C#
string[] fruits = { "りんご", "みかん", "バナナ" };

配列の要素を取得する方法

配列から値を取得するときは、配列名の後ろに角括弧を記述し、その中にインデックスを指定します。

C#
int[] numbers = { 10, 20, 30 };

int firstNumber = numbers[0];

Console.WriteLine(firstNumber); // 10

最後の要素を取得したい場合は、Lengthプロパティを利用すると便利です。

C#
int[] numbers = { 10, 20, 30 };

int lastNumber = numbers[numbers.Length - 1];

Console.WriteLine(lastNumber); // 30

Lengthは配列の要素数を返します。この例では要素数が3なので、numbers.Length - 12になります。

配列の要素を変更する方法

配列の要素は、インデックスを指定して新しい値を代入することで変更できます。

C#
int[] numbers = { 10, 20, 30 };

numbers[1] = 100;

Console.WriteLine(numbers[1]); // 100

変更後の配列は、次の状態になります。

10, 100, 30

存在しないインデックスを指定するとエラーになるため、配列の要素数を超えないように注意しましょう。

配列の要素数を取得する方法

配列の要素数は、Lengthプロパティで取得できます。

C#
string[] fruits = { "りんご", "みかん", "バナナ" };

Console.WriteLine(fruits.Length); // 3

Lengthは、ループ処理の回数を決めるときにもよく使用されます。

C#
for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine(fruits[i]);
}

条件式をi <= fruits.Lengthにすると、最後に存在しないインデックスへアクセスしてしまいます。配列をループ処理するときは、基本的にi < 配列名.Lengthと記述します。

配列に要素を追加する方法

C#の配列は、作成した時点で要素数が固定されます。そのため、通常の変数への代入と同じ方法で、配列の末尾に新しい要素を追加することはできません。

C#
int[] numbers = { 10, 20, 30 };

// numbers[3] = 40;
// 存在しないインデックスなのでエラー

配列へ要素を追加したい場合は、新しい配列を作成して既存の要素をコピーします。

C#
int[] numbers = { 10, 20, 30 };

Array.Resize(ref numbers, numbers.Length + 1);
numbers[numbers.Length - 1] = 40;

Console.WriteLine(string.Join(", ", numbers));
// 10, 20, 30, 40

Array.Resizeを使うと、指定した要素数の新しい配列が作られ、元の要素がコピーされます。

ただし、要素の追加を何度も行う場合は、配列よりもList<T>を使うほうが適しています。

C#
using System.Collections.Generic;

List<int> numbers = new List<int> { 10, 20, 30 };

numbers.Add(40);

Console.WriteLine(string.Join(", ", numbers));
// 10, 20, 30, 40

List<T>では、Addメソッドを使って簡単に要素を追加できます。

C#
numbers.Add(50);
numbers.Add(60);

配列とList<T>は、次のように使い分けるとよいでしょう。

種類特徴適している場面
配列要素数が固定されるデータ数が最初から決まっている
List<T>要素を追加・削除できるデータ数が増減する

要素数が変わらないデータには配列、後からデータを追加・削除する可能性がある場合はList<T>が便利です。

for文で配列をループ処理する方法

配列のすべての要素を順番に処理するときは、for文を使用できます。

C#
int[] numbers = { 10, 20, 30 };

for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}

実行結果は次のとおりです。

10
20
30

for文では、インデックスを利用できるため、要素の番号と値を同時に表示できます。

C#
string[] fruits = { "りんご", "みかん", "バナナ" };

for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine($"{i}番目の要素:{fruits[i]}");
}

実行結果は次のとおりです。

0番目の要素:りんご
1番目の要素:みかん
2番目の要素:バナナ

配列の要素を書き換えたい場合にも、for文が役立ちます。

C#
int[] numbers = { 10, 20, 30 };

for (int i = 0; i < numbers.Length; i++)
{
numbers[i] *= 2;
}

Console.WriteLine(string.Join(", ", numbers));
// 20, 40, 60

foreach文で配列をループ処理する方法

配列の要素を先頭から順番に取り出すだけであれば、foreach文を使うと簡潔に記述できます。

C#
string[] fruits = { "りんご", "みかん", "バナナ" };

foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}

実行結果は次のとおりです。

りんご
みかん
バナナ

varを使い、要素のデータ型をコンパイラに推論させることもできます。

C#
foreach (var fruit in fruits)
{
Console.WriteLine(fruit);
}

for文とforeach文には、次のような違いがあります。

ループ特徴
forインデックスを使用でき、配列の要素を書き換えやすい
foreach記述が簡潔で、すべての要素を順番に読み取る処理に適している

インデックスが必要な処理や要素の変更にはfor文、要素を順番に参照するだけならforeach文を使用すると分かりやすくなります。

配列の合計値を計算する方法

ループ処理を使えば、数値が入った配列の合計値を計算できます。

C#
int[] scores = { 80, 90, 75 };
int total = 0;

foreach (int score in scores)
{
total += score;
}

Console.WriteLine(total); // 245

平均値を求める場合は、合計値を配列の要素数で割ります。

C#
int[] scores = { 80, 90, 75 };
int total = 0;

foreach (int score in scores)
{
total += score;
}

double average = (double)total / scores.Length;

Console.WriteLine(average);

totalscores.Lengthはどちらもint型です。そのまま割り算をすると小数部分が切り捨てられるため、(double)を付けて小数の計算に変換しています。

Arrayクラスの便利なメソッド

C#には、配列を操作するためのArrayクラスが用意されています。

配列を並べ替える

Array.Sortを使うと、配列の要素を昇順に並べ替えられます。

C#
int[] numbers = { 30, 10, 20 };

Array.Sort(numbers);

Console.WriteLine(string.Join(", ", numbers));
// 10, 20, 30

配列の順番を反転する

Array.Reverseを使うと、要素の順番を反転できます。

C#
int[] numbers = { 10, 20, 30 };

Array.Reverse(numbers);

Console.WriteLine(string.Join(", ", numbers));
// 30, 20, 10

降順に並べたい場合は、Array.SortArray.Reverseを組み合わせます。

C#
int[] numbers = { 30, 10, 20 };

Array.Sort(numbers);
Array.Reverse(numbers);

Console.WriteLine(string.Join(", ", numbers));
// 30, 20, 10

指定した値を検索する

Array.IndexOfを使うと、指定した値が格納されているインデックスを取得できます。

C#
string[] fruits = { "りんご", "みかん", "バナナ" };

int index = Array.IndexOf(fruits, "みかん");

Console.WriteLine(index); // 1

値が見つからなかった場合は、-1が返されます。

C#
int index = Array.IndexOf(fruits, "ぶどう");

if (index == -1)
{
Console.WriteLine("要素が見つかりませんでした");
}

配列をコピーする

Array.Copyを使うと、配列の要素を別の配列へコピーできます。

C#
int[] source = { 10, 20, 30 };
int[] destination = new int[source.Length];

Array.Copy(source, destination, source.Length);

Console.WriteLine(string.Join(", ", destination));
// 10, 20, 30

単純なコピーであれば、Cloneメソッドも利用できます。

C#
int[] source = { 10, 20, 30 };
int[] copied = (int[])source.Clone();

多次元配列の使い方

C#では、表のようなデータを扱うための多次元配列も利用できます。

2次元配列は、次のように宣言・初期化します。

C#
int[,] numbers =
{
{ 10, 20, 30 },
{ 40, 50, 60 }
};

要素を取得するときは、行と列のインデックスを指定します。

C#
Console.WriteLine(numbers[0, 0]); // 10
Console.WriteLine(numbers[1, 2]); // 60

2次元配列をすべて表示する場合は、for文を入れ子にします。

C#
int[,] numbers =
{
{ 10, 20, 30 },
{ 40, 50, 60 }
};

for (int row = 0; row < numbers.GetLength(0); row++)
{
for (int column = 0; column < numbers.GetLength(1); column++)
{
Console.Write($"{numbers[row, column]} ");
}

Console.WriteLine();
}

GetLength(0)は行数、GetLength(1)は列数を取得します。

配列を使用するときの注意点

C#の配列を扱う際は、インデックスの範囲に注意しましょう。

C#
int[] numbers = { 10, 20, 30 };

Console.WriteLine(numbers[3]);

この配列で使用できるインデックスは0から2までです。numbers[3]へアクセスすると例外が発生します。

安全にアクセスするには、インデックスが0以上かつ配列の要素数未満であることを確認します。

C#
int[] numbers = { 10, 20, 30 };
int index = 2;

if (index >= 0 && index < numbers.Length)
{
Console.WriteLine(numbers[index]);
}

また、配列変数がnullの状態でLengthや要素へアクセスすると、NullReferenceExceptionが発生します。

C#
int[]? numbers = null;

if (numbers != null)
{
Console.WriteLine(numbers.Length);
}

配列を扱うときは、次の点を意識することが大切です。

  • インデックスは0から始まる

  • 最後のインデックスはLength - 1になる

  • 作成後の要素数は固定される

  • 要素を頻繁に追加・削除する場合はList<T>を検討する

  • 配列変数がnullでないことを確認する

まとめ

C#の配列は、同じデータ型の値を複数まとめて管理するための機能です。配列を利用すると、関連するデータを1つの変数にまとめ、インデックスを使って効率的に操作できます。

配列は、次のように宣言・初期化します。

C#
int[] numbers = { 10, 20, 30 };

要素の取得や変更には、0から始まるインデックスを使用します。

C#
Console.WriteLine(numbers[0]);

numbers[1] = 100;

すべての要素を順番に処理する場合は、for文またはforeach文が便利です。

C#
foreach (int number in numbers)
{
Console.WriteLine(number);
}

C#の配列は作成後に要素数を直接変更できません。要素を頻繁に追加・削除する場合は、List<T>を利用しましょう。

配列の宣言、初期化、要素へのアクセス、ループ処理は、C#プログラミングの基本です。まずは数値や文字列を格納した簡単な配列を作り、値の取得や変更を実際に試しながら使い方を身につけましょう。