C#配列の使い方を初心者向けに徹底解説|宣言・初期化・追加・ループ処理までわかる入門ガイド

はじめに

C#で複数のデータをまとめて扱いたいときに便利なのが「配列」です。たとえば、5人分の点数や複数の商品名を保存する場合、変数を一つずつ用意するよりも、配列を使ったほうがコードを簡潔に記述できます。

しかし、C#を学び始めたばかりの方のなかには、次のような疑問を持つ方も多いでしょう。

  • 配列はどのように宣言するのか

  • 宣言と初期化にはどのような違いがあるのか

  • 配列に要素を追加するにはどうすればよいのか

  • for文やforeach文で配列を処理する方法がわからない

  • 配列の要素数やインデックスの扱いが難しい

この記事では、C#の配列について、基本的な仕組みから宣言・初期化・要素の取得・変更・追加・ループ処理まで、初心者向けにわかりやすく解説します。

1. C#の配列とは?初心者向けに基本をわかりやすく解説

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

たとえば、3人分の点数を通常の変数で管理する場合は、次のように複数の変数を用意する必要があります。

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

配列を使えば、これらの値を一つの変数にまとめられます。

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

scoresという配列のなかに、809075という3つの整数が格納されています。

配列を使う主なメリットは、複数のデータをまとめて管理できることです。さらに、for文やforeach文と組み合わせることで、配列内のすべての要素を効率よく処理できます。

C#で配列を宣言する方法

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

データ型[] 配列名;

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

int[] scores;

文字列を格納する配列の場合は、次のようになります。

string[] names;

配列には、基本的に同じデータ型の値を格納します。int[]には整数、string[]には文字列を格納します。

次のように、配列の角括弧を変数名の後ろに書く形式も使用できます。

int scores[];

ただし、C#では一般的にデータ型の直後に角括弧を書く形式が推奨されます。

int[] scores;

コードの読みやすさを保つためにも、通常はこの形式を使用するとよいでしょう。

配列を初期化する方法

配列は、宣言しただけでは実際に要素を格納する領域が作成されません。配列を使用するには、要素数を指定して初期化する必要があります。

int[] scores = new int[3];

このコードでは、整数を3つ格納できる配列を作成しています。

配列を初期化すると、各要素にはデータ型に応じた初期値が自動的に設定されます。int型の初期値は0です。

int[] scores = new int[3];

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

代表的なデータ型の初期値は次のとおりです。

データ型初期値
int0
double0.0
boolfalse
stringnull
クラス型null

宣言と同時に値を設定することもできます。

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

要素数は指定した値から自動的に判断されるため、次のようにnew int[]を省略することも可能です。

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

C#では、さらに簡潔なコレクション式も利用できます。

int[] scores = [80, 90, 75];

学習環境やプロジェクトで使用しているC#のバージョンによってはコレクション式を利用できないため、初心者のうちは次の書き方を覚えておくと幅広い環境に対応できます。

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

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

配列内の値は「インデックス」を指定して取得します。インデックスとは、配列内の要素が何番目にあるかを示す番号です。

C#の配列では、インデックスが0から始まります。

string[] fruits = { "りんご", "みかん", "ぶどう" };

Console.WriteLine(fruits[0]); // りんごConsole.WriteLine(fruits[1]); // みかんConsole.WriteLine(fruits[2]); // ぶどう

1番目の要素はfruits[0]、2番目の要素はfruits[1]です。

初心者が間違えやすいポイントは、最初の要素をfruits[1]だと考えてしまうことです。配列のインデックスは必ず0から始まると覚えておきましょう。

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

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

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

scores[1] = 100;

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

この例では、インデックス1に格納されていた90100に変更しています。

配列自体を作り直さなくても、個々の要素は自由に変更できます。

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

配列に格納できる要素数は、Lengthプロパティを使って取得できます。

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

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

Lengthは、配列をループ処理するときによく使用します。

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

配列のインデックスは0から始まるため、最後のインデックスは「要素数から1を引いた値」です。

要素数が3の場合、使用できるインデックスは012になります。

int lastIndex = scores.Length - 1;Console.WriteLine(scores[lastIndex]); // 75

存在しないインデックスを指定するとエラーになる

配列の範囲外にあるインデックスを指定すると、IndexOutOfRangeExceptionという例外が発生します。

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

Console.WriteLine(scores[3]);

この配列の有効なインデックスは0から2までです。そのため、scores[3]にはアクセスできません。

特にfor文を使用するときは、条件式に注意してください。

次のコードでは、iが配列の要素数と同じ値になるため、エラーが発生します。

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

正しくは、<=ではなく<を使用します。

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

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

配列内のすべての要素を順番に処理したい場合は、for文を使用できます。

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

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

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

809075

for文ではインデックスを利用できるため、「何番目の要素か」を表示したい場合や、特定の要素を書き換えたい場合に適しています。

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

for (int i = 0; i < names.Length; i++){Console.WriteLine($"{i + 1}人目: {names[i]}");}

また、すべての要素に同じ処理を行い、値を更新することもできます。

int[] prices = { 100, 200, 300 };

for (int i = 0; i < prices.Length; i++){prices[i] += 50;}

処理後の配列は、150250350になります。

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

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

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

foreach (int score in scores){Console.WriteLine(score);}

scoreには、配列の各要素が順番に代入されます。

配列のデータ型が明確な場合は、varを使用することもできます。

foreach (var score in scores){Console.WriteLine(score);}

foreach文は、インデックスを意識せずに全要素を処理できる点がメリットです。一方で、基本的にはループ変数へ新しい値を代入して配列の要素を書き換えることはできません。

foreach (int score in scores){// score = 100; コンパイルエラー}

配列の要素を変更したい場合は、インデックスを扱えるfor文を使用しましょう。

配列内の合計値と平均値を求める方法

ループ処理を使えば、配列内の数値の合計や平均を計算できます。

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

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

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

Console.WriteLine($"合計: {total}");Console.WriteLine($"平均: {average}");

totalint型ですが、平均値には小数が含まれる可能性があります。そのため、割り算を行う前にdouble型へ変換しています。

LINQを使用すると、より短く記述することもできます。

using System.Linq;

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

int total = scores.Sum();double average = scores.Average();

Console.WriteLine($"合計: {total}");Console.WriteLine($"平均: {average}");

初心者のうちは、まずループ処理で計算する方法を理解し、その後でLINQの便利なメソッドを学ぶとよいでしょう。

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

C#の配列は、作成した時点で要素数が固定されます。

int[] numbers = new int[3];

この配列には3つの要素しか格納できません。そのため、配列に直接4つ目の要素を追加することはできません。

要素を増やしたい場合は、Array.Resizeメソッドを使って配列のサイズを変更できます。

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

Array.Resize(ref numbers, 4);numbers[3] = 40;

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

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

10203040

ただし、Array.Resizeは既存の配列そのものを拡張しているわけではありません。内部では新しいサイズの配列を作成し、元の要素をコピーしています。

要素の追加や削除を頻繁に行う場合は、配列よりもList<T>を使用するほうが適しています。

using System.Collections.Generic;

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

numbers.Add(40);numbers.Add(50);

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

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

numbers.Add(60);

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

用途適した型
要素数が最初から決まっている配列
要素の追加や削除をほとんど行わない配列
要素を頻繁に追加・削除するList<T>
データ数が途中で変化するList<T>

「C#の配列に要素を追加したい」と考えたときは、本当に配列を使う必要があるのか、List<T>のほうが適していないかを検討しましょう。

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

配列の末尾へ1つの要素を追加する場合は、Array.Resizeで要素数を1つ増やします。

string[] names = { "田中", "佐藤" };

Array.Resize(ref names, names.Length + 1);names[names.Length - 1] = "鈴木";

names.Length + 1で新しい配列の要素数を指定し、names.Length - 1で最後のインデックスを取得しています。

ただし、追加を繰り返すたびに配列の再作成とコピーが行われるため、大量のデータを追加する処理には向いていません。追加回数が多い場合はList<T>を利用してください。

配列をコピーする方法

配列を別の変数へ単純に代入すると、同じ配列を参照することになります。

int[] original = { 10, 20, 30 };int[] copied = original;

copied[0] = 100;

Console.WriteLine(original[0]); // 100

copiedの要素を変更すると、originalの要素も変更されます。

別の配列としてコピーしたい場合は、Cloneメソッドを利用できます。

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

copied[0] = 100;

Console.WriteLine(original[0]); // 10Console.WriteLine(copied[0]); // 100

Array.Copyメソッドを使う方法もあります。

int[] original = { 10, 20, 30 };int[] copied = new int[original.Length];

Array.Copy(original, copied, original.Length);

配列の一部だけをコピーすることも可能です。

int[] original = { 10, 20, 30, 40, 50 };int[] copied = new int[3];

Array.Copy(original, 1, copied, 0, 3);

この場合、copiedには203040が格納されます。

配列を並べ替える方法

配列内の要素を昇順に並べ替える場合は、Array.Sortメソッドを使用します。

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

Array.Sort(numbers);

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

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

10203040

降順にしたい場合は、昇順に並べ替えたあとでArray.Reverseを使用できます。

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

文字列の配列も並べ替えられます。

string[] names = { "Suzuki", "Tanaka", "Sato" };

Array.Sort(names);

Array.Sortは元の配列の並び順を変更します。元の配列を残したい場合は、先に配列をコピーしてから並べ替えましょう。

配列から値を検索する方法

特定の値が配列の何番目にあるかを調べるには、Array.IndexOfメソッドを使用します。

string[] fruits = { "りんご", "みかん", "ぶどう" };

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

Console.WriteLine(index); // 1

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

int index = Array.IndexOf(fruits, "バナナ");

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

値が含まれているかどうかだけを確認したい場合は、LINQのContainsメソッドを使用できます。

using System.Linq;

bool exists = fruits.Contains("みかん");

if (exists){Console.WriteLine("みかんが含まれています");}

多次元配列とは

C#では、表のように行と列を持つ「多次元配列」も作成できます。

2次元配列の宣言と初期化は次のとおりです。

int[,] matrix ={{ 1, 2, 3 },{ 4, 5, 6 }};

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

Console.WriteLine(matrix[0, 0]); // 1Console.WriteLine(matrix[1, 2]); // 6

すべての要素を処理する場合は、for文を入れ子にします。

for (int row = 0; row < matrix.GetLength(0); row++){for (int column = 0; column < matrix.GetLength(1); column++){Console.WriteLine(matrix[row, column]);}}

GetLength(0)は1次元目の要素数、GetLength(1)は2次元目の要素数を返します。

この配列では、次の値が取得できます。

Console.WriteLine(matrix.GetLength(0)); // 2Console.WriteLine(matrix.GetLength(1)); // 3

ジャグ配列とは

ジャグ配列とは、配列のなかに複数の配列を格納する仕組みです。「配列の配列」とも呼ばれます。

int[][] numbers ={new int[] { 1, 2 },new int[] { 3, 4, 5 },new int[] { 6 }};

それぞれの内部配列は、異なる要素数を持つことができます。

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

ジャグ配列をループ処理する場合は、foreach文を入れ子にするとわかりやすく記述できます。

foreach (int[] row in numbers){foreach (int number in row){Console.WriteLine(number);}}

配列をメソッドの引数として渡す方法

配列は、メソッドの引数として渡すこともできます。

static void PrintNumbers(int[] numbers){foreach (int number in numbers){Console.WriteLine(number);}}

呼び出すときは、配列をそのまま指定します。

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

PrintNumbers(numbers);

配列は参照型なので、メソッド内で要素を変更すると、呼び出し元の配列にも変更が反映されます。

static void ChangeFirstValue(int[] numbers){numbers[0] = 100;}

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

ChangeFirstValue(numbers);

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

意図せず元の配列を書き換えないように注意しましょう。

配列をメソッドの戻り値として返す方法

メソッドで作成した配列を戻り値として返すこともできます。

static int[] CreateNumbers(){return new int[] { 10, 20, 30 };}

呼び出し側では、戻り値を配列変数に代入します。

int[] numbers = CreateNumbers();

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

指定された要素数の配列を作成して返すメソッドも記述できます。

static int[] CreateSequentialNumbers(int length){int[] numbers = new int[length];

for (int i = 0; i &lt; numbers.Length; i++){numbers<span data-placeholder-token="true" class="text-token-text-primary cursor-text rounded-sm" style="background-color: color-mix(in srgb, var(--theme-user-selection-bg, var(--selection)) 30%, transparent); padding-top: 4px; padding-bottom: 4px;">[i]</span> = i + 1;}return numbers;

}

次のように呼び出します。

int[] numbers = CreateSequentialNumbers(5);

作成される配列の内容は、12345です。

空の配列を作成する方法

要素数が0の配列は、次のように作成できます。

int[] numbers = new int[0];

Array.Empty<T>()を使う方法もあります。

int[] numbers = Array.Empty<int>();

空の配列のLength0です。

Console.WriteLine(numbers.Length); // 0

nullと空の配列は異なります。

int[] numbers1 = null;int[] numbers2 = Array.Empty<int>();

numbers1に対してLengthへアクセスすると、NullReferenceExceptionが発生します。一方、numbers2は配列として存在しているため、安全にLengthを取得できます。

Console.WriteLine(numbers2.Length); // 0

配列が存在しない状態を明確に表したい場合を除き、空の配列を返すほうが呼び出し側で扱いやすくなります。

C#の配列で初心者が注意したいポイント

C#の配列を使用するときは、次の点に注意しましょう。

まず、配列のインデックスは0から始まります。要素数が5の場合、最後のインデックスは4です。

int[] numbers = new int[5];

numbers[0] = 10;numbers[4] = 50;

次に、配列は作成後に要素数を直接変更できません。要素を頻繁に追加・削除する場合は、List<T>が適しています。

また、配列変数がnullの可能性がある場合は、使用前に確認が必要です。

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

null条件演算子を使うこともできます。

Console.WriteLine(numbers?.Length);

さらに、ループ処理では条件式を正しく設定してください。

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

i <= numbers.Lengthと書くと範囲外のインデックスへアクセスするため、エラーになります。

まとめ

C#の配列は、同じデータ型の値を複数まとめて管理するための基本的な機能です。

配列は、データ型の後ろに[]を付けて宣言します。

int[] numbers;

要素数を指定して初期化する場合は、次のように記述します。

int[] numbers = new int[3];

最初から値を設定する場合は、波括弧のなかに要素を並べます。

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

配列の要素は、0から始まるインデックスを使って取得・変更できます。

Console.WriteLine(numbers[0]);numbers[1] = 100;

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

Console.WriteLine(numbers.Length);

配列全体を処理する場合は、インデックスを扱えるfor文や、簡潔に記述できるforeach文を使用します。

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

配列は要素数が固定されているため、要素を頻繁に追加・削除する処理には向いていません。追加が必要な場合はArray.Resizeを利用できますが、データ数が変化する処理ではList<T>を使用するのが一般的です。

配列は、C#でループ処理やデータ管理を学ぶうえで欠かせない機能です。まずは宣言・初期化・インデックス・Length・ループ処理の5つを理解し、簡単なプログラムのなかで実際に使いながら身につけていきましょう。