2017-05-01 48 views
0

我正在將舊的VC++代碼翻譯成C#。在C++程序,我有一個三維陣列,以在運行時所指定的第三維,c中的三維數組#

int * init_ltr [26][28]; 

int init_ltr_size = x;  // gets assigned to something 

// array allocated and initialized 
for (i=0; i < 26; i++) 
    for (j=0; j < 28; j++) 
     init_ltr[i][j] = new int [init_ltr_size]; 

我可以然後引用項以後,如:

init_ltr[firstchar-'a'][secchar-'a'][ix] = wordnum; 

如何做到這一點在C#?我試圖宣佈它爲int [] init_ltr [26][28],但編譯器不喜歡那樣。如果可能的話,我想保留一個三維數組(而不是使用列表或其他),所以我不必去改變大量的代碼。

+1

_「...而不是使用列表...」 _ - 你知不知道'List'其'Item'屬性,可'[]'速記因此不需要 – MickyD

+0

無需更改代碼無論如何,你的問題不是_「動態」_因此你不需要_「列表」_ – MickyD

回答

2

在c#中有兩個選項,鋸齒狀數組和多維數組。多維數組往往有更好的語法,見下文:

鐵血陣列:

int[][][] init_ltr = new int[26][][]; 

int init_ltr_size = x; 

// array allocated and initialized 
for (i=0; i < 26; i++) 
    init_ltr[i] = new int[28][]; 
    for (j=0; j < 28; j++) 
     init_ltr[i][j] = new int[init_ltr_size]; 

init_ltr[0][0][0] = 0; 

多維數組:

int[,,] init_ltr = new int[26, 28, x]; 
init_ltr[0,0,0] = 0; 
+0

謝謝,鋸齒陣列解決方案最接近我想要做的。 – tcrosley

1

C#

var size1 = 26; 
    var size2 = 28; 

    var initLtr = new int[size1][][]; 
    var initLtrSize = 33;  // gets assigned to something 

    for (var i = 0; i < size1; i++) 
    { 
     initLtr[i] = new int[size2][]; 
     for (var j = 0; j < size2; j++) 
      initLtr[i][j] = new int[initLtrSize]; //it could even be different sizes in each array e.g: new int[i + j] 
    } 

    initLtr[0][0][0] = 3; 

這只是一個物質或初始化每個交錯數組內的陣列。

0

張貼由DesertFox溶液的替代。由於前2維是硬編碼的,因此可以使用二維數組,並使用鋸齒形數組作爲第三維。例如,我使用[3,5]。您可以將其更改爲[26,28]。

int[,][] init_ltr = new int[3, 5][]; // init_ltr [26, 28][] 
int init_ltr_size = 2; // Assign some value 
for (var i = 0; i <= init_ltr.GetUpperBound(0); i++) 
    for (var j = 0; j <= init_ltr.GetUpperBound(1); j++) 
    { 
     init_ltr[i, j] = new int[init_ltr_size]; 
     for (var k = 0; k < init_ltr[i, j].Length; k++) 
      init_ltr[i, j][k] = (i + 1) * (j + 1) * (k + 1); // Assign some value 
    } 

// Print values of arrays. Use int_ltr[i, j][k] 
for (var i = 0; i <= init_ltr.GetUpperBound(0); i++) 
    for (var j = 0; j <= init_ltr.GetUpperBound(1); j++) 
     for (var k = 0; k < init_ltr[i, j].Length ; k++) 
      Console.WriteLine(init_ltr[i, j][k]);