2017-02-23 112 views
1

的範圍之外我有一個交錯數組聲明:C#交錯數組:數組問題

char[][] m = new char[10][]; 

後來,它被填充。

System.Text.StringBuilder s = new System.Text.StringBuilder(c); 
for (int x = 0; x < 10; x++) 
    s.Append('='); 

    for (int x = 0; x < 10; x++) m[x] = s.ToString().ToCharArray(); 

如果我執行下面的操作,我得到第二維度中的錯誤:

Console.WriteLine(String.Format("width={0}", m.GetLength(0))); 
Console.WriteLine(String.Format("height={0}", m.GetLength(1))); <---- ERROR HERE 

任何想法?

+0

它是一個鋸齒狀的數組,不是一個方形數組(你用'char [,] maz'聲明)。每個子陣列將具有不同的長度。你用'maz [index] .Length'檢查。 – Abion47

+0

不要使用['GetLenght()'](https://msdn.microsoft.com/en-us/library/system.array.getlength(v = vs.110).aspx),而是['Length' ](https://msdn.microsoft.com/en-us/library/system.array.length(v = vs.110).aspx)第一個數組的單個項目。 – Sinatr

回答

2

您正在混淆正方形數組和鋸齒形數組。鋸齒狀排列也被稱爲陣列的陣列,它看起來像這樣:

char[][] a = new char[10][]; 

在交錯數組中的每個元素是在它自己右邊的陣列,並且它可以從任何的具有完全不同的長度其他:

a[0] = new char[1]; 
a[1] = new char[100]; 
a[2] = new char[5]; 
... 
a[9] = new char[999999]; 

正如你所看到的,GetLength(1)使得鋸齒狀陣列上沒有任何意義。它甚至會返回什麼?爲了得到陣列的第二級的長度,你將不得不通過他們迭代,並調用它們的各種Length性質:

for (int i = 0; i < a.Length; i++) 
{ 
    int length = a[i].Length; 
} 

你的目的,你可能需要使用一個方形陣列(也稱爲2D陣列)代替:

char[,] a = new char[10,10]; 

與鋸齒陣列不同,方陣的第二維保證具有相同的長度。這意味着GetLength(1)可以自信地返回一個值。

1

Array.GetLength(int dimension)僅用於多維陣列。你的數組'm'是而不是多維,但是鋸齒狀的

這意味着它是一個元素類型爲char[]的數組。

因此,您只有一個維度(長度爲10),並且GetLength(1)會引發錯誤。

您可以從09獲得m[i].Length。但只有當您初始化元素時:

m[0] = new char[10]; 
int l = m[0].Length; // 10 
+0

從技術上講,你可以使用GetLength來處理任何類型的數組。如果您嘗試查詢不存在的維度,那麼它只會引發異常;對於每個非多維數組,唯一存在的維度爲「0」。 (還有一個事實,就是沒有理由在非多維數組上使用'GetLength',因爲'Length'既快又方便。 – Abion47