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];
値を指定していない要素には、データ型に応じた初期値が自動的に設定されます。主な初期値は次のとおりです。
| データ型 | 初期値 |
|---|---|
int | 0 |
double | 0.0 |
bool | false |
string | null |
次のコードでは、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 - 1は2になります。
配列の要素を変更する方法
配列の要素は、インデックスを指定して新しい値を代入することで変更できます。
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);
totalとscores.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.SortとArray.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#プログラミングの基本です。まずは数値や文字列を格納した簡単な配列を作り、値の取得や変更を実際に試しながら使い方を身につけましょう。

