C#配列の使い方を初心者向けに解説|宣言・初期化・要素の追加・Listとの違いまで
はじめに
C#で複数のデータをまとめて扱いたいときに便利なのが「配列」です。配列を使うと、同じ型の値を1つの変数にまとめて保存できます。
たとえば、5人分の点数を個別の変数で管理すると、次のように記述しなければなりません。
int score1 = 80;int score2 = 75;int score3 = 90;int score4 = 68;int score5 = 85;配列を利用すれば、これらの値を1つにまとめられます。
int[] scores = { 80, 75, 90, 68, 85 };コードが短くなるだけでなく、繰り返し処理を使ってすべての値を簡単に参照できる点も配列のメリットです。
この記事では、C#における配列の宣言や初期化、要素の取得・変更、繰り返し処理、要素を追加する方法について初心者向けに解説します。配列とListの違いも紹介するため、どちらを使うべきか迷っている方も参考にしてください。
1. C#の配列とは?初心者向けに基本を解説
C#の配列とは、同じデータ型の値を複数まとめて管理するための仕組みです。
整数を保存する配列には整数だけ、文字列を保存する配列には文字列だけを格納します。原則として、1つの配列に異なる型の値を混在させることはできません。
int[] numbers = { 10, 20, 30 };string[] names = { "田中", "佐藤", "鈴木" };配列に保存された一つひとつの値を「要素」と呼びます。また、各要素には「インデックス」と呼ばれる番号が割り当てられています。
C#の配列では、インデックスが0から始まる点に注意しましょう。
string[] names = { "田中", "佐藤", "鈴木" };Console.WriteLine(names[0]); // 田中Console.WriteLine(names[1]); // 佐藤Console.WriteLine(names[2]); // 鈴木
要素が3つある配列の場合、使用できるインデックスは0、1、2です。names[3]のように存在しないインデックスを指定すると、実行時にIndexOutOfRangeExceptionが発生します。
C#で配列を宣言する方法
C#で配列を宣言するときは、データ型の後ろに角括弧[]を付けます。
データ型[] 変数名;整数を格納する配列は、次のように宣言します。
int[] numbers;文字列を格納する場合は、次のように記述します。
string[] names;この時点では変数を宣言しただけで、配列そのものは作成されていません。配列を利用するには、宣言とあわせて配列を生成する必要があります。
C#で配列を初期化する方法
配列の初期化方法はいくつかあります。
要素数を指定して配列を作成する場合は、newを使用します。
int[] numbers = new int[3];このコードでは、整数を3つ保存できる配列を作成しています。値を指定していない要素には、データ型に応じた初期値が設定されます。
intの初期値は0、boolの初期値はfalse、stringなどの参照型の初期値はnullです。
int[] numbers = new int[3];Console.WriteLine(numbers[0]); // 0Console.WriteLine(numbers[1]); // 0Console.WriteLine(numbers[2]); // 0
配列の作成と同時に値を設定することもできます。
int[] numbers = new int[] { 10, 20, 30 };C#では、右辺の型を省略して、より短く書くことも可能です。
int[] numbers = { 10, 20, 30 };宣言時に型を推論させる場合は、次のように記述します。
var numbers = new[] { 10, 20, 30 };ただし、var numbers = { 10, 20, 30 };のようにnew[]まで省略することはできません。
配列の要素を取得する方法
配列の要素を取得するときは、変数名の後ろにインデックスを指定します。
string[] fruits = { "りんご", "みかん", "バナナ" };string firstFruit = fruits[0];
Console.WriteLine(firstFruit); // りんご
最後の要素は、配列のLengthプロパティを利用して取得できます。
string[] fruits = { "りんご", "みかん", "バナナ" };Console.WriteLine(fruits[fruits.Length - 1]); // バナナ
Lengthは配列の要素数を表します。この例では要素数が3であるため、最後のインデックスは3 - 1で2です。
C#では、インデックス演算子^を使って末尾から要素を指定することもできます。
Console.WriteLine(fruits[^1]); // バナナConsole.WriteLine(fruits[^2]); // みかん^1は末尾から1番目、^2は末尾から2番目の要素を表します。
配列の要素を変更する方法
配列内の値は、インデックスを指定して変更できます。
int[] numbers = { 10, 20, 30 };numbers[1] = 100;
Console.WriteLine(numbers[1]); // 100
この例では、インデックス1に保存されていた20を100へ変更しています。
配列そのものの要素数は作成後に変更できませんが、各要素に保存されている値は変更可能です。
配列の要素数を取得する方法
配列の要素数は、Lengthプロパティで取得します。
int[] numbers = { 10, 20, 30, 40 };Console.WriteLine(numbers.Length); // 4
Lengthは、配列を繰り返し処理するときにもよく使用します。
int[] numbers = { 10, 20, 30 };for (int i = 0; i < numbers.Length; i++){Console.WriteLine(numbers[i]);}
条件式をi <= numbers.Lengthにすると、最後に存在しないインデックスへアクセスしてしまいます。配列を先頭から処理するときは、基本的にi < numbers.Lengthと記述しましょう。
foreach文で配列の全要素を処理する方法
配列のすべての要素を順番に取り出すだけであれば、foreach文を使うと簡潔に記述できます。
string[] names = { "田中", "佐藤", "鈴木" };foreach (string name in names){Console.WriteLine(name);}
実行結果は次のとおりです。
田中佐藤鈴木for文はインデックスを利用したい場合や要素を書き換えたい場合に向いています。一方、foreach文は配列の値を順番に参照したい場合に便利です。
C#の配列に要素を追加する方法
C#の配列は、作成した時点で要素数が固定されます。そのため、JavaScriptのpushのように、既存の配列へ直接要素を追加することはできません。
int[] numbers = { 10, 20, 30 };この配列の要素数は3で固定されており、4つ目の保存領域はありません。
要素を追加したい場合は、元の配列より大きな新しい配列を作成し、既存の値をコピーします。
int[] numbers = { 10, 20, 30 };int[] newNumbers = new int[numbers.Length + 1];
Array.Copy(numbers, newNumbers, numbers.Length);newNumbers[newNumbers.Length - 1] = 40;
numbers = newNumbers;
実行後のnumbersには、次の値が格納されています。
10, 20, 30, 40Array.Resizeメソッドを使うと、より短く記述できます。
int[] numbers = { 10, 20, 30 };Array.Resize(ref numbers, numbers.Length + 1);numbers[^1] = 40;
ただし、Array.Resizeも既存の配列自体を拡張しているわけではありません。内部では新しい配列を作成し、元の要素をコピーしています。
要素の追加や削除を何度も行う場合は、配列よりもList<T>を使うほうが適しています。
配列とListの違い
配列とList<T>は、どちらも複数の値をまとめて管理するために使用します。大きな違いは、要素数を変更できるかどうかです。
配列は作成時に要素数が固定されます。
int[] numbers = new int[3];一方、List<T>はAddメソッドを使って、後から要素を追加できます。
using System.Collections.Generic;List<int> numbers = new List<int>();
numbers.Add(10);numbers.Add(20);numbers.Add(30);
コレクション初期化子を使うと、次のように記述できます。
List<int> numbers = new List<int>{10,20,30};要素を削除することも可能です。
numbers.Remove(20);配列とListの主な違いは次のとおりです。
| 比較項目 | 配列 | List |
|---|---|---|
| 要素数 | 作成後は固定 | 追加・削除が可能 |
| 要素の追加 | 新しい配列の作成が必要 | Addで追加可能 |
| 要素の削除 | 新しい配列の作成が必要 | Removeなどで削除可能 |
| 要素数の取得 | Length | Count |
| インデックスによる参照 | 可能 | 可能 |
| 向いている用途 | 要素数が決まっているデータ | 要素数が変化するデータ |
保存するデータ数が最初から決まっている場合は配列が適しています。
string[] weekdays ={"月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"};ユーザーが入力したデータを追加する場合や、処理中に要素数が変化する場合はList<T>が便利です。
List<string> userNames = new List<string>();userNames.Add("田中");userNames.Add("佐藤");
初心者のうちは「要素数が固定なら配列」「要素を追加・削除するならList」と覚えておくとよいでしょう。
多次元配列の基本
C#では、表のように行と列を持つ多次元配列も作成できます。
int[,] matrix ={{ 1, 2, 3 },{ 4, 5, 6 }};要素を取得するときは、行と列のインデックスを指定します。
Console.WriteLine(matrix[0, 0]); // 1Console.WriteLine(matrix[1, 2]); // 6matrix[1, 2]は、インデックス1の行にあるインデックス2の列を表します。
多次元配列の各次元の要素数は、GetLengthメソッドで取得できます。
Console.WriteLine(matrix.GetLength(0)); // 行数:2Console.WriteLine(matrix.GetLength(1)); // 列数:3すべての要素を処理する場合は、for文を入れ子にします。
for (int row = 0; row < matrix.GetLength(0); row++){for (int column = 0; column < matrix.GetLength(1); column++){Console.WriteLine(matrix[row, column]);}}配列を使うときによくあるエラー
C#の配列を扱う際に初心者が特に注意したいのが、存在しないインデックスへのアクセスです。
int[] numbers = { 10, 20, 30 };Console.WriteLine(numbers[3]);
この配列で使用できるインデックスは0から2までです。numbers[3]へアクセスすると、IndexOutOfRangeExceptionが発生します。
また、配列変数がnullの状態で要素へアクセスすると、NullReferenceExceptionが発生します。
int[] numbers = null;Console.WriteLine(numbers.Length);
配列がnullになる可能性がある場合は、事前に確認しましょう。
if (numbers != null){Console.WriteLine(numbers.Length);}配列に要素があるか確認したい場合は、nullと要素数の両方をチェックします。
if (numbers != null && numbers.Length > 0){Console.WriteLine(numbers[0]);}まとめ
C#の配列は、同じ型のデータを複数まとめて管理するための仕組みです。データ型の後ろに[]を付けることで宣言でき、インデックスを指定して各要素を取得・変更できます。
int[] numbers = { 10, 20, 30 };Console.WriteLine(numbers[0]);numbers[1] = 100;
配列のインデックスは0から始まり、要素数はLengthプロパティで取得します。すべての要素を順番に処理するときは、for文やforeach文が便利です。
一方、配列の要素数は作成後に変更できません。要素を頻繁に追加・削除する場合は、AddやRemoveを利用できるList<T>が適しています。
要素数が決まっているデータには配列、要素数が変化するデータにはListを使うなど、目的に応じて使い分けましょう。

