.NET の多次元配列とジャグ配列

概要

この記事では、 .NET (C#, VB.NET) の「多次元配列」と「ジャグ配列」について解説します。多次元配列とジャグ配列の宣言は、以下のように行います。

// 多次元配列
string[,] twoDimension;
string[,,] threeDimension;

// ジャグ配列 (配列の配列)
string[][] twoJag;
string[][][] threeJag;

上記の例では、 new する部分などを省略しています。詳細な文法は MSDN を併せて参照してください。

C++Java との違い

C++Java には .NET のような多次元配列がないため、 2次元配列 (多次元配列) を宣言するときは、「配列の配列」を使用します。 C++Java の「配列の配列」と .NET の「ジャグ配列」はほぼ同様です。

多次元配列の例

多次元配列のサンプル (C#) を以下に示します。以下の例では、 4 行 2 列の多次元配列を作成し、 foreach と for 文の両方で値を表示しています。

実行結果を見ると、 foreach を使って値を表示した方は、行ごとの処理ではなく値がシーケンシャルに表示されていることがわかります。そのため、行ごとに処理を行いたい状況では、 for 文を使用した方が良いかもしれません。

for 文では、配列の行数が必要になります。行数は、「全体の長さ / 次元」で求めることができるので、 Length プロパティと Rank プロパティを参照します。 Length プロパティは、全体の長さ (この例の場合 8) を返します。 Rank プロパティは、配列の次元 (この例の場合 2) を返します。

// 多次元配列の例
private static void SampleTwoDimension()
{
    // 多次元配列 (二次元配列)
    string[,] twoDimension = {
        {"aa", "bb"},
        {"cc", "dd"},
        {"ee", "ff"},
        {"gg", "hh"},
    };

    System.Diagnostics.Debug.WriteLine("foreach の例");

    // foreach の例
    foreach (string s in twoDimension)
    {
        System.Diagnostics.Debug.WriteLine(s);
    }

    System.Diagnostics.Debug.WriteLine("");
    System.Diagnostics.Debug.WriteLine("for の例");

    // for の例
    for (int i = 0; i < twoDimension.Length / twoDimension.Rank; ++i)
    {
        for (int j = 0; j < twoDimension.Rank; ++j)
        {
            System.Diagnostics.Debug.Write(twoDimension[i, j] + " ");
        }
        System.Diagnostics.Debug.WriteLine("");
    }
}

// [実行結果]
/*
foreach の例
aa
bb
cc
dd
ee
ff
gg
hh

for の例
aa bb 
cc dd 
ee ff 
gg hh 
*/

ジャグ配列の例

ジャグ配列のサンプル (C#) を以下に示します。以下の例では、 4 行 ? 列のジャグ配列を作成しています。行によって列の数が異なるのがジャグ配列の特徴です。 C++Java のユーザには、非常になじみ深い文法だと思います。

// ジャグ配列の例
private static void SampleJagArray()
{
    // ジャグ配列 (配列の配列)
    string[][] jagArray = {
        new string[] {"aa", "bb"},
        new string[] {"cc", "dd", "11", "22"},
        new string[] {"ee", "ff", "33"},
        new string[] {"gg", "hh"},
    };

    System.Diagnostics.Debug.WriteLine("foreach の例");

    // foreach の例
    foreach (string[] array in jagArray)
    {
        foreach (string s in array)
        {
            System.Diagnostics.Debug.Write(s + " ");
        }
        System.Diagnostics.Debug.WriteLine("");
    }

    System.Diagnostics.Debug.WriteLine("");
    System.Diagnostics.Debug.WriteLine("for の例");

    // for の例
    for (int i = 0; i < jagArray.Length; ++i)
    {
        for (int j = 0; j < jagArray[i].Length; ++j)
        {
            System.Diagnostics.Debug.Write(jagArray[i][j] + " ");
        }
        System.Diagnostics.Debug.WriteLine("");
    }
}

// [実行結果]
/*
foreach の例
aa bb 
cc dd 11 22 
ee ff 33 
gg hh 

for の例
aa bb 
cc dd 11 22 
ee ff 33 
gg hh 
*/

まとめ

以上、 .NET の多次元配列とジャグ配列を見てきました。多次元配列とジャグ配列を簡単に比較します。

  • 多次元配列
    • 初期化時に new を省略可能
    • 行ごとに列数を変えることができない
    • 行ごとに処理を行うには Length プロパティと Rank プロパティを参照
  • ジャグ配列
    • 初期化時に new を省略できない
    • 行ごとに列数を変えることができる (jag; ギザギザ)
    • 行ごとに処理を行うには foreach で容易に可能

多次元配列とジャグ配列の使い分けですが、基本的にはその用途によって使い分けるのがいいと思います。多次元配列は行ごとの列数が同じ場合に、ジャグ配列は行ごとの列数が異なる場合に使用するのがいいでしょう。どちらのパフォーマンスが良いかなどの話もありますが、用途によって使い分けることでソースコードの意図を明確に表すことができます。