ホーム > .NET Framework | Tips | プログラミング > C#でGenericなJag配列の生成と多次元配列からの変換

C#でGenericなJag配列の生成と多次元配列からの変換

以前に、C#で配列の初期値つきの初期化について書きましたが、今回は更に多次元配列とかJag配列とかを簡単に作りたいっていう話。

C#では多次元配列(a[2,3]みたいなやつ)も使えますが、僕はJag配列(a[2][3]みたいなやつ)の方が圧倒的に使用頻度が高いです。配列の配列っていう概念の方がわかりやすいし。
できることとしては何が違うか知りませんが、引数の都合などでたまに多次元配列をJag配列化したいことがあります。
最初は任意の次元の配列も再帰とかで書ける気がしたんだけど、実は書けないっぽい。

ついでに、以前の記事のように初期値つきJag配列初期化についても考えたけど、こちらも再帰的に書けないきがしている。
多次元の配列の初期化は、次元が増えるほど面倒なので、とりあえず妥協して、途中の次元まではArray型の配列型、最後の配列だけGenericに生成するようにして、初期化付きJag配列生成メソッドを書いてみた。

public class k2kArray
{
    public static T[][] ConvertToJag<T>(T[,] array)
    {
        int i, j;
        var ret = new T[array.GetLength(0)][];
        int l = array.GetLength(1);
 
        for (i = 0; i < ret.Length; ++i)
        {
            ret[i] = new T[l];
            for (j = 0; j < l; ++j) ret[i][j] = array[i, j];
        }
 
        return ret;
    }
 
    public static TElem[] Init<TElem>(TElem[] arr, TElem InitialValue) where TElem : struct { return Init<TElem>(arr, () => InitialValue); }
    public static TElem[] Init<TElem>(TElem[] arr, Func<TElem> InitElem) { return Init<TElem>(arr, (i) => InitElem()); }
    public static TElem[] Init<TElem>(TElem[] arr, Func<int, TElem> InitElem)
    {
        int i;
        for (i = 0; i < arr.Length; ++i) arr[i] = InitElem(i);
        return arr;
    }
 
    public static TElem[] CreateInit<TElem>(int Length, TElem InitialValue) where TElem : struct { return CreateInit<TElem>(Length, () => InitialValue); }
    public static TElem[] CreateInit<TElem>(int Length, Func<TElem> InitElem) { return CreateInit<TElem>(Length, (i) => InitElem()); }
    public static TElem[] CreateInit<TElem>(int Length, Func<int, TElem> InitElem) { return Init<TElem>(new TElem[Length], InitElem); }
 
    public static Array CreateJagArray<TElem>(Func<TElem> InitElem, params int[] Length)
    {
        return CreateJagArrayDelegate<TElem>(Length, Length.Length, InitElem)();
    }
 
    public static Func<Array> CreateJagArrayDelegate<TElem>(int[] Length, int Dimension, Func<TElem> InitElem)
    {
        if (Dimension == 0)
        {
            return () => CreateInit<TElem>(Length[Dimension], InitElem);
        }
        else
        {
            return () =>
                      CreateInit<Array>(Length[Dimension-1],
                            CreateJagArrayDelegate<TElem>(Length, Dimension - 1, InitElem)
                      );
        }
    }
 
}

なんか微妙。string[][]の初期化とかしたいんだけど、Array[]になっちゃう。。
その後キャストするにしてもうまい方法が思いつかない。
なんかいい方法ないかな。っていういつもの結論。

コメント:0

コメントフォーム
入力した情報を記憶する

トラックバック:0

この記事のトラックバック URL
http://ka.taoka.info/wp-trackback.php?p=165
トラックバックの送信元リスト
C#でGenericなJag配列の生成と多次元配列からの変換 - ka.taoka.info より

ホーム > .NET Framework | Tips | プログラミング > C#でGenericなJag配列の生成と多次元配列からの変換

カレンダー
« 2018 年 10月 »
S M T W T F S
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
最近の反応
メタ情報

ページの上部に戻る