C#で二次元配列・二次元リストを使う方法|サンプルコード付きで解説

C#でデータを扱っていると、1列の一覧だけではなく、行と列を持つ表形式のデータを扱いたい場面がよくあります。
たとえば、成績表、座席表、ゲームのマップ、CSVの読み込み結果、在庫一覧、月別売上表などです。

こうしたときに使われるのが、二次元配列二次元リストです。

ただ、初心者のうちは次のような疑問を持ちやすいです。

  • 二次元配列とは何か

  • 一次元配列と何が違うのか

  • int[,]List<List<int>> はどう使い分けるのか

  • 行数と列数をどう取得するのか

  • ループでどう取り出せばよいのか

  • 値の追加や変更はどう書くのか

  • 配列とリストではどちらが便利なのか

  • 実務ではどちらを使うことが多いのか

C#では、表形式データを扱う方法が1つだけではありません。
代表的なものだけでも、次のような選択肢があります。

  • 二次元配列 int[,]

  • ジャグ配列 int[][]

  • 二次元リスト List<List<int>>

見た目が似ていても、それぞれ特徴や向いている場面が異なります。
その違いを理解しないまま使うと、途中で追加しにくかったり、ループが書きにくかったり、思ったより扱いづらく感じることがあります。

この記事では、C#における二次元配列と二次元リストの使い方について、基礎から実践、サンプルコード、よくあるミス、使い分けの考え方までできるだけわかりやすく解説します。
「とりあえず動く」だけでなく、どういう場面で何を選ぶべきかまで理解できる内容にしていきます。


二次元配列とは何か

まずは基本から整理しましょう。

二次元配列とは、行と列の2つの方向で値を管理する配列です。
一次元配列が1列のデータだとすると、二次元配列は表のようなイメージです。

たとえば、一次元配列はこんなイメージです。

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

これは1列に並んだデータです。

一方、二次元配列は次のように表形式になります。

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

この場合、次のような構造です。

列0 列1 列2
行0 1 2 3
行1 4 5 6

つまり、numbers[0, 0] は 1、numbers[1, 2] は 6 になります。


C#で表形式データを扱う主な方法

C#では、表形式データを扱う方法が1種類だけではありません。
初心者が混乱しやすいので、ここで整理しておきます。

1. 二次元配列 [,]

行数と列数が固定された、きれいな表形式のデータに向いています。

2. ジャグ配列 [][]

配列の中に配列を入れる方法です。
行ごとに列数を変えられます。

3. 二次元リスト List<List<T>>

リストの中にリストを入れる方法です。
後から行や列を追加しやすいのが特徴です。

この記事では主に、次の2つを中心に解説します。

  • 二次元配列 [,]

  • 二次元リスト List<List<T>>

必要に応じて、ジャグ配列との違いも補足します。


二次元配列の基本的な書き方

C#の二次元配列は、型名の後ろに [,] を付けて宣言します。

宣言の基本形

int[,] matrix;

これは「int型の二次元配列を宣言した」だけで、まだサイズは決まっていません。

サイズを指定して作成する

int[,] matrix = new int[2, 3];

このコードは、2行3列 の二次元配列を作成しています。

  • 行数: 2

  • 列数: 3

すべての要素は初期値 0 で作られます。


二次元配列を初期化する方法

初期値をまとめて指定したい場合は、次のように書けます。

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

この場合、2行3列の配列になります。

イメージ

  • matrix[0, 0] = 1

  • matrix[0, 1] = 2

  • matrix[0, 2] = 3

  • matrix[1, 0] = 4

  • matrix[1, 1] = 5

  • matrix[1, 2] = 6


二次元配列の値を取り出す方法

二次元配列では、行番号と列番号の2つを指定して要素へアクセスします。

int[,] matrix = {
{ 10, 20, 30 },
{ 40, 50, 60 }
};

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

ポイント

  • 最初の数字が行

  • 次の数字が列

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

つまり、matrix[1, 2] は「2行目・3列目」という意味です。


二次元配列の値を変更する方法

値を変更したいときも、行と列を指定して代入します。

int[,] matrix = new int[2, 2];

matrix[0, 0] = 100;
matrix[0, 1] = 200;
matrix[1, 0] = 300;
matrix[1, 1] = 400;

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


二次元配列をループで表示する方法

二次元配列は、通常 for文を2重に使って走査します。

サンプルコード

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

for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine();
}

実行結果

1 2 3
4 5 6

GetLength() の意味

  • GetLength(0) は行数

  • GetLength(1) は列数

この使い方は非常に重要です。


二次元配列の行数と列数を取得する方法

C#の二次元配列では、Length だけでは全要素数しかわかりません。
行数や列数を知りたいときは GetLength() を使います。

int[,] matrix = new int[3, 4];

Console.WriteLine(matrix.GetLength(0)); // 3
Console.WriteLine(matrix.GetLength(1)); // 4
Console.WriteLine(matrix.Length); // 12

まとめ

  • GetLength(0) → 行数

  • GetLength(1) → 列数

  • Length → 全要素数

初心者がよく混同するポイントなので、しっかり区別しておきましょう。


foreachで二次元配列を扱う方法

二次元配列は foreach でも回せます。
ただし、行列の位置情報は取れず、すべての要素が順番に取り出されるだけです。

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

foreach (int value in matrix)
{
Console.WriteLine(value);
}

実行結果

1
2
3
4
5
6

注意点

foreach は簡単ですが、

  • 行番号が必要

  • 列番号が必要

  • 表形式で表示したい

といった場合は、for の二重ループのほうが向いています。


二次元配列の具体例:成績表を管理する

ここで、実務や学習でイメージしやすい例を見てみましょう。

例: 3人分の3教科の点数

int[,] scores = {
{ 80, 75, 90 },
{ 60, 88, 70 },
{ 95, 85, 100 }
};

この配列は次のように見られます。

  • 行 = 生徒

  • 列 = 教科

表示してみる

for (int student = 0; student < scores.GetLength(0); student++)
{
Console.Write("生徒" + (student + 1) + ": ");

for (int subject = 0; subject < scores.GetLength(1); subject++)
{
Console.Write(scores[student, subject] + " ");
}

Console.WriteLine();
}

実行結果

生徒1: 80 75 90
生徒2: 60 88 70
生徒3: 95 85 100

二次元配列の具体例:合計や平均を求める

二次元配列は集計にも使えます。

1人ごとの合計点を求める

int[,] scores = {
{ 80, 75, 90 },
{ 60, 88, 70 },
{ 95, 85, 100 }
};

for (int student = 0; student < scores.GetLength(0); student++)
{
int total = 0;

for (int subject = 0; subject < scores.GetLength(1); subject++)
{
total += scores[student, subject];
}

Console.WriteLine($"生徒{student + 1}の合計点: {total}");
}

実行結果

生徒1の合計点: 245
生徒2の合計点: 218
生徒3の合計点: 280

二次元リストとは何か

次に、二次元リストを見ていきます。

二次元リストとは、List<T> の中にさらに List<T> を入れた構造です。
つまり、リストの各要素がまたリストになっています。

基本形

List<List<int>> matrix = new List<List<int>>();

これは「int型のリストを要素として持つリスト」です。

見た目は二次元配列に似ていますが、特徴はかなり違います。


二次元リストの基本的な作り方

初期化例

List<List<int>> matrix = new List<List<int>>
{
new List<int> { 1, 2, 3 },
new List<int> { 4, 5, 6 },
new List<int> { 7, 8, 9 }
};

これは3行3列のように見える二次元リストです。

値の取り出し方

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

ポイント

  • 最初の [0] で行を取る

  • 次の [0] でその行の列を取る

二次元配列の matrix[0, 0] とは書き方が違います。


二次元リストの値を追加する方法

二次元リストの大きなメリットは、後から追加しやすいことです。

行を追加する

List<List<int>> matrix = new List<List<int>>();

matrix.Add(new List<int> { 1, 2, 3 });
matrix.Add(new List<int> { 4, 5, 6 });

列のように要素を追加する

matrix[0].Add(99);

これで1行目の末尾に 99 が追加されます。

Si quieres conocer otros artículos parecidos a C#で二次元配列・二次元リストを使う方法|サンプルコード付きで解説 puedes visitar la categoría Webukaihatsu.

Go up