2017-02-23 5 views
1

Ich habe eine gezackte Array deklariert als:C# Jagged Array: außerhalb der Grenzen des Arrays Ausgabe

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

Später es bevölkert ist.

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(); 

Wenn ich die folgenden Operationen ausführen, bekomme ich einen Fehler auf der zweiten Dimension:

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

Irgendwelche Ideen?

+0

Es ist ein gezacktes Array, kein quadratisches Array (das Sie mit 'char [,] maz') deklarieren. Jedes Unterfeld wird eine andere Länge haben. das überprüfen Sie mit 'maz [index] .Length'. – Abion47

+0

Verwenden Sie nicht ['GetLenght()'] (https://msdn.microsoft.com/en-us/library/system.array.getlength (v = vs.110) .aspx), sondern ['Length' ] (https://msdn.microsoft.com/en-us/library/system.array.length (v = vs.110) .aspx) eines einzelnen Elements des ersten Arrays. – Sinatr

Antwort

2

Sie verwechseln quadratische Arrays und gezackte Arrays. Eine gezackte Anordnung wird auch als ein Array von Arrays bekannt, und es sieht so aus:

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

Jedes Element in einem gezackten Array ist ein Array, in seinem eigenen Recht, und es kann eine völlig unterschiedliche Länge von jedem haben, die anderen:

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

Wie Sie sehen können, GetLength(1) macht keinen Sinn, auf einem gezackten Array. Was würde es überhaupt zurückkehren? Um die Längen der zweiten Ebene des Arrays zu erhalten, müssten Sie sie durchlaufen und rufen ihre verschiedenen Length Eigenschaften:

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

für Ihre Zwecke, möchten Sie wahrscheinlich eine quadratische Anordnung verwenden (auch als 2D bekannt Array) statt:

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

Im Gegensatz zu einem gezackten Array, die zweite Dimension einer quadratischen Anordnung gewährleistet die gleiche Länge. Das bedeutet GetLength(1) kann einen Wert mit Sicherheit zurückgeben.

1

Array.GetLength(int dimension) ist nur für mehrdimensionale Arrays. Ihr Array 'm' ist nicht mehrdimensional, aber gezackt.

Das bedeutet, es ist ein Array mit Elementtyp char[].

So haben Sie nur eine Dimension (mit der Länge 10) und GetLength(1) wirft den Fehler.

Sie können m[i].Length für i von 0 bis 9 erhalten. Aber nur, wenn Sie die Elemente initialisiert haben:

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

Technisch gesehen können Sie 'GetLength' für jedes Array verwenden. Es wird nur eine Ausnahme ausgelöst, wenn Sie versuchen, eine Dimension abzufragen, die nicht existiert, und für jedes nicht-multidimensionale Array ist die einzige existierende Dimension "0". (Es gibt auch die Tatsache, dass es buchstäblich keinen Grund gibt, "GetLength" auf einem nicht-multidimensionalen Array zu verwenden, da "Length" sowohl schneller als auch bequemer ist.) – Abion47

Verwandte Themen