C# PR

【C#】2次元配列の要素数を理解して効率的にコーディングする方法

【C#】2次元配列の要素数を理解して効率的にコーディングする方法
記事内に商品プロモーションを含む場合があります

こんにちは!

C#でプログラミングを学んでいると、多くの場面で役立つ重要な概念が「2次元配列」です。

2次元配列って何だろう?
要素数はどうやって数えるの?
配列の範囲外アクセスでエラーが発生してしまう…

もしかすると、そんな悩みを抱えているかもしれません。

この記事では、C#における2次元配列の基礎から、要素数の扱い方、さらには具体的な活用例までを詳しく解説していきます。

この記事は、以下のような方におすすめです。

この記事はこんな人におすすめ!
  • C#の2次元配列の基本を知りたい方
  • 配列の要素数をどう扱えばいいか知りたい方
  • 2次元配列を使った具体的なプログラミング例を見たい方
  • 配列の範囲外アクセスによるエラーを防ぎたい方

この記事を読めば、2次元配列の扱い方をイメージできるだけでなく、実際に配列を使ったプログラミングができるようになります。

それでは、順を追って詳しく見ていきましょう!

2次元配列とは

まずは、2次元配列の基本的な概念について理解しましょう。

2次元配列の基本構造

2次元配列は、データを行と列の形式で格納できる配列です。表計算ソフトのような縦横のマス目をイメージすると分かりやすいでしょう。

以下は2次元配列の基本的な構造を示した図です。

[0,0] [0,1] [0,2]  <- 1行目
[1,0] [1,1] [1,2]  <- 2行目
[2,0] [2,1] [2,2]  <- 3行目
  ↑     ↑     ↑
1列目  2列目  3列目

この例では、3行3列の2次元配列を表しています。各要素には[行番号,列番号]でアクセスできます。C#では、配列のインデックスは0から始まることに注意が必要です。

2次元配列の宣言方法

C#で2次元配列を宣言する方法は主に2つあります。

宣言方法 構文 説明
型[,] int[,] array = new int[3,3]; 最も一般的な方法。行数と列数を指定して宣言
配列の配列 int[][] array = new int[3][]; 各行の列数を可変にできる(ジャグ配列)

一般的な2次元配列の宣言と初期化の例を見てみましょう。

// 3行4列の配列を宣言
int[,] numbers = new int[3,4];

// 初期値を指定して宣言
int[,] matrix = new int[,] {
  {1, 2, 3, 4},
  {5, 6, 7, 8},
  {9, 10, 11, 12}
};

要素数の取得方法

2次元配列で重要なのが、要素数の取得方法です。C#では、配列の次元や要素数を取得するためのプロパティが用意されています。

配列の次元数を取得

配列の次元数を取得するには、Rankプロパティを使用します。

int[,] array = new int[3,4];
int rank = array.Rank; // 結果: 2

行数と列数の取得

GetLength()メソッドを使うと、各次元の要素数を取得できます。

int[,] array = new int[3,4];
int rows = array.GetLength(0);    // 行数: 3
int columns = array.GetLength(1); // 列数: 4

総要素数の取得

配列の総要素数を取得するには、Lengthプロパティを使用します。

int[,] array = new int[3,4];
int totalElements = array.Length; // 結果: 12 (3 × 4)

以下の表で、要素数の取得方法をまとめてみましょう。

プロパティ/メソッド 説明 戻り値の例
Rank 配列の次元数を取得 2
GetLength(0) 行数を取得 3
GetLength(1) 列数を取得 4
Length 総要素数を取得 12

2次元配列の基本的な操作

2次元配列を扱う上で必要な基本的な操作を見ていきましょう。

要素へのアクセス

2次元配列の要素にアクセスするには、行番号と列番号を指定します。

int[,] matrix = new int[,] {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9}
};

// 要素へのアクセス
int value = matrix[1,1]; // 5を取得
matrix[0,2] = 10;       // 値の変更

配列の繰り返し処理

2次元配列の全要素に対して処理を行う方法はいくつかあります。それぞれの特徴を見ていきましょう。

1. ネストされたforループ

最も一般的な方法は、二重のforループを使用する方法です。各要素の添字(インデックス)を明示的に指定できるため、要素の位置を意識した処理が可能です。

int[,] matrix = new int[,] {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9}
};

// 全要素に対して処理
for (int i = 0; i < matrix.GetLength(0); i++)
{
  for (int j = 0; j < matrix.GetLength(1); j++)
  {
    // インデックスを使った処理が可能
    Console.WriteLine($"Position [{i},{j}]: {matrix[i,j]}");

    // 値の更新も可能
    matrix[i,j] *= 2; // 各要素を2倍に
  }
}

2. foreachループ

foreachを使用すると、配列の要素を順番に取り出すことができます。インデックスは取得できませんが、コードがシンプルになります。

int[,] matrix = new int[,] {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9}
};

// 全要素を順番に処理
foreach (int element in matrix)
{
  Console.WriteLine(element);
  // 注意: ここではインデックス情報は取得できない
}

3. Array.ForEachメソッド

LINQの機能を使って配列を1次元に変換してからArray.ForEachメソッドを使用することもできます。この方法は、要素に対して同じ処理を適用する場合に便利です。

int[,] matrix = new int[,] {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9}
};

// Cast<int>() で配列を1次元配列に変換してから処理
Array.ForEach(matrix.Cast<int>().ToArray(), element =>
{
  Console.WriteLine(element);
});

以下の表で、それぞれの方法の特徴をまとめてみましょう。

処理方法 メリット デメリット
ネストされたforループ ・インデックスを使用可能
・要素の位置を考慮した処理が可能
・コードが比較的長くなる
foreachループ ・シンプルで読みやすい
・要素の順序処理に最適
・インデックス情報が取得できない
Array.ForEachメソッド ・簡潔に書ける
・ラムダ式が使える
・1次元配列への変換が必要
・インデックス情報が取得できない

用途に応じて、これらの方法を使い分けることで、より効率的なプログラミングが実現できます。

範囲外アクセスの防止

配列の範囲外にアクセスするとIndexOutOfRangeExceptionが発生します。これを防ぐために、以下のような方法があります。

public static bool IsValidIndex(int[,] array, int row, int col)
{
  return row >= 0 && row < array.GetLength(0) &&
         col >= 0 && col < array.GetLength(1);
}

// 使用例
int[,] matrix = new int[3,3];
int row = 4;
int col = 2;

if (IsValidIndex(matrix, row, col))
{
  int value = matrix[row,col];
}
else
{
  Console.WriteLine("インデックスが範囲外です。");
}

2次元配列の具体的な活用例

ここからは、2次元配列の具体的な活用例を見ていきましょう。

行列の計算

2次元配列は行列の計算によく使用されます。

public static int[,] MultiplyMatrix(int[,] matrix1, int[,] matrix2)
{
  int rows1 = matrix1.GetLength(0);
  int cols1 = matrix1.GetLength(1);
  int cols2 = matrix2.GetLength(1);

  int[,] result = new int[rows1,cols2];

  for (int i = 0; i < rows1; i++)
  {
    for (int j = 0; j < cols2; j++)
    {
      for (int k = 0; k < cols1; k++)
      {
        result[i,j] += matrix1[i,k] * matrix2[k,j];
      }
    }
  }

  return result;
}

画像処理での活用

画像処理では、ピクセルデータを2次元配列として扱うことがあります。

public static void InvertColors(int[,] image)
{
  int height = image.GetLength(0);
  int width = image.GetLength(1);

  for (int y = 0; y < height; y++)
  {
    for (int x = 0; x < width; x++)
    {
      // 255はRGB値の最大値
      image[y,x] = 255 - image[y,x];
    }
  }
}

ゲーム開発での活用

ゲーム開発では、マップデータやキャラクターの位置情報を2次元配列で管理することがあります。

public class GameMap
{
  private int[,] map;

  public GameMap(int height, int width)
  {
    map = new int[height,width];
  }

  public bool IsWalkable(int x, int y)
  {
    if (!IsValidIndex(map, y, x))
      return false;

    return map[y,x] == 0; // 0は通行可能を表す
  }

  private bool IsValidIndex(int[,] array, int row, int col)
  {
    return row >= 0 && row < array.GetLength(0) &&
           col >= 0 && col < array.GetLength(1);
  }
}

パフォーマンスと注意点

2次元配列を使用する際は、以下の点に注意が必要です。

メモリ使用量

2次元配列は、宣言時に指定したサイズ分のメモリを確保します。大きな配列を作成する場合は、メモリ使用量に注意が必要です。

以下は、配列のサイズとメモリ使用量の関係を示した表です。

配列サイズ 整数型(4バイト)の場合のメモリ使用量
100×100 約40KB
1000×1000 約4MB
10000×10000 約400MB

アクセス速度

2次元配列は、メモリ上で連続して配置されています。行方向のアクセスの方が、列方向のアクセスよりも高速です。

int[,] array = new int[1000,1000];

// 行方向のアクセス(高速)
for (int i = 0; i < array.GetLength(0); i++)
{
  for (int j = 0; j < array.GetLength(1); j++)
  {
    array[i,j] = 0;
  }
}

// 列方向のアクセス(低速)
for (int j = 0; j < array.GetLength(1); j++)
{
  for (int i = 0; i < array.GetLength(0); i++)
  {
    array[i,j] = 0;
  }
}

範囲チェック

配列の範囲外アクセスは実行時エラーの原因となります。必ず範囲チェックを行うことをおすすめします

public static T GetElement<T>(T[,] array, int row, int col, T defaultValue)
{
  if (IsValidIndex(array, row, col))
    return array[row,col];
  else
    return defaultValue;
}

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、LINEでお気軽にご相談ください♪

まとめ

ここまで、C#における2次元配列について詳しく解説してきました。改めて、重要なポイントをおさらいしましょう。

  • 2次元配列は行と列の形式でデータを扱える
  • 要素数はGetLength()Lengthで取得できる
  • 範囲外アクセスには十分な注意が必要
  • パフォーマンスを考慮したアクセス方法がある
  • 画像処理やゲーム開発など、様々な分野で活用できる

2次元配列は、C#プログラミングにおける基本的かつ重要な機能です。この記事で紹介した内容を参考に、ぜひ2次元配列をプログラミングに活用してみてください。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です