プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【C#】初期化された値型の2次元配列を作るメソッド

概要

var matrix = new int[9][];
            for (int i = 0; i < 9; i++)
                matrix[i] = new int[9];

配列の配列の初期化でいちいち↑みたいなのを書くのがうっとうしかったのでメソッド化しました。
矩形配列*1だとラクなんですが。

メソッド

/// <summary>
/// 値型の2次元配列を初期化して返すメソッド
/// </summary>
/// <example>GetInit2DimArray<int>(9,9)</example>
/// <typeparam name="T">配列の型。値型のみ</typeparam>
/// <param name="maxRow">生成する2次元配列の最大行数</param>
/// <param name="maxCol">生成する2次元配列の最大列数</param>
/// <returns>値型の2次元配列</returns>
public static T[][] GetInit2DimArray<T>(int maxRow, int maxCol) where T : struct
{
    T[][] initMat = new T[maxRow][];
    //それぞれの型に定義された初期値(default(T))で初期化
    for (int i = 0; i < maxRow; i++)
        initMat[i] = Enumerable.Repeat(default(T), maxCol).ToArray();

    return initMat;
}

2016/3/9 修正:値型限定処理を制約条件に変更
既定の初期値以外で初期化したい(trueで初期化したいなど)場合や各要素で配列長を変えたい場合は別途作ってください。

使用例

10行4列のint型2次元配列を作る場合です。

int[][] arr = GetInit2DimArray<int>(10, 4);

f:id:shirakamisauto:20160308232024p:plain

参照型で初期化する場合

参照型ができないのは以下参照。
【C#】Enumerable.Repeatの誤解 - プログラミングとかブログ
forループでいちいちインスタンス生成してやればいいとも思いましたが、型を決めてないので通常のインスタンス生成もできませんでした。
型が決まっているなら以下のようにすれば参照型でも初期化できます。

public static TestClass[][] GetInit2DimTestClassArray(int maxRow, int maxCol)
{
    TestClass[][] initMat = new TestClass[maxRow][];

    for (int i = 0; i < maxRow; i++)
    {
        TestClass[] colArray = new TestClass[maxCol];
        for (int j = 0; j < maxCol; j++)
            colArray[j] = new TestClass();

        initMat[i] = colArray;
    }
    return initMat;
}

参考
値型と参照型の区別と違い、クラスと構造体の違い: .NET Tips: C#, VB.NET

*1:int[9,9]みたいなやつ