2012-02-24 11 views
1

C++コードをC#に変換する途中です。いくつかのC++配列の静的初期化に問題があります。次のC++を考えてみましょう。C++からC#への配列/行列初期化コードの変換

int Values[][32] = { 
    {}, {}, {1, 2, 3}, {1} 
}; 

これは4x32整数の行列を作成します。私はC#で同じか同様のことをできるだけ簡単に行う必要があります。私は事はC#が不均一なサブ配列サイズと配列の初期化を許可していないようである

static int[][] Values = {...}; 

...または

static int[,] Values = {...}; 

のいずれかを取得するために探しています。それ以外の場合は、new int[4,32] {...}を指定すると、中括弧の間のすべてが正確に32の長さでなければなりません。 C++では{1, 2, 3}を指定することができ、コンパイラは不足している配列メンバの残りの部分を0で埋めます。

[編集]私はLINQを使って試して、私が望むものを得ましたが、それは面倒です。

答えて

1

と別のものを追加してい(以下雄弁) 1つは動作するはずです。

// utility function you can put in a class 
static int[] BuildArray32(params int[] values) 
{ 
    int[] retVal = new int[32]; 
    Array.Copy(values, retVal, values.Length); 
    return retVal; 
} 

// array initializer code 
int[][] Values = { 
    BuildArray32(), 
    BuildArray32(), 
    BuildArray32(1, 2, 3), 
    BuildArray32(1), 
}; 

EDITそれとも、ビルダークラスを作ることができる:)

class MatrixBuilder 
{ 
    int width; 
    List<int[]> rows; 

    public MatrixBuilder(int width) 
    { 
     this.width = width; 
     this.rows = new List<int[]>(); 
    } 

    public MatrixBuilder Add(params int[] row) 
    { 
     int[] wideRow = new int[width]; 
     Array.Copy(row, wideRow, row.Length); 
     rows.Add(wideRow); 
     return this; 
    } 

    public int[][] ToMatrix() 
    { 
     return rows.ToArray(); 
    } 
} 

int[][] Values2 = new MatrixBuilder(32) 
    .Add() 
    .Add() 
    .Add(1, 2, 3) 
    .Add(1) 
    .ToMatrix(); 
+0

Brilliant!特にMatrixBuilderが好きです。 ;-)ありがとう! – wpfwannabe

2

C#では、配列初期化子のサイズは、配列の宣言されたサイズと一致する必要があります。重複を避けたい場合は、サイズを宣言する必要はありません。

あなたは同じサイズであるためにすべてのエントリが必要な場合は、このような小さなヘルパー関数Expand、でそれを行うことができます:私は私の前の回答を削除

static int[] Expand(int[] src, int size) { 
    var res = new int[size]; 
    Array.Copy(src, res, src.Length); 
    return res; 
} 

static int[][] Values = new int[4][] { 
    Expand(new[] {1}, 32) 
, Expand(new[] {1,2,3}, 32) 
, Expand(new[] {1,2,3}, 32) 
, Expand(new[] {1,2,3, 4, 5}, 32) 
}; 
+0

おかげで、これは私が必要とするものではありません、あなたはその後、あなたの既知の初期値を適用し、その後、ゼロに配列すべてを初期化することができます。私は最終的には、私はC++でやったように、すべての初期化を指定しません。 – wpfwannabe

+0

@wpfwannabe少なくともあなたがしようとしている方法ではなく、C#でこれを行うことはできません。私は一瞬でそれを行う一つの方法を示すために編集します... – dasblinkenlight

0

あなたはC#でそれを行うことはできません。

 int[][] initAll = new [] 
           { 
            new int[32] , 
            new int[32] , 
            new int[32] , 
            new int[32] 
           }; 

またはジャグ配列を初期化:

int[][] initJagged = new[] 
           { 
            new[] {1, 3, 5, 7, 9}, 
            new[] {1, 3, }, 
            new[] {1, 3,0,0,0,0,}, 
            new int[32] 
           };