it-swarm.com.de

Warum haben wir sowohl ein gezacktes als auch ein mehrdimensionales Array?

  1. Was ist der Unterschied zwischen einem gezackten Array und einem mehrdimensionalen Array . Gibt es einen Vorteil auf einem anderen?

  2. Und warum erlaubte mir das Visual Studio nicht, eine 

    MyClass[][] abc = new MyClass[10][20];
    

    (Früher haben wir das in C++ gemacht, aber in C # unterstreicht es [20] mit einer roten, zackigen Linie. Sagt ungültiger Rangbezeichner.)

    ist aber zufrieden mit 

    MyClass[,] abc = new MyClass[10,20];
    
  3. Wie kann ich das schließlich in einer einzigen Zeile initialisieren (wie in einem einfachen Array mit {new xxx...}{new xxx....})

    MyClass[][,][,] itemscollection;
    
56
Shekhar_Pro
  1. Ein gezacktes Array ist ein Array von Arrays. Ein int[][] ist also ein Array von int[], die jeweils unterschiedliche Längen haben und ihren eigenen Block im Speicher belegen können. Ein mehrdimensionales Array (int[,]) ist ein einzelner Speicherblock (im Wesentlichen eine Matrix).

  2. Sie können keinen MyClass[10][20] erstellen, da jedes Sub-Array separat initialisiert werden muss, da es sich um separate Objekte handelt:

    MyClass[][] abc = new MyClass[10][];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20];
    }
    

    ein MyClass[10,20] ist in Ordnung, da ein einzelnes Objekt als Matrix mit 10 Zeilen und 20 Spalten initialisiert wird

  3. Ein MyClass[][,][,] kann wie folgt initialisiert werden (wird jedoch nicht getestet):

    MyClass[][,][,] abc = new MyClass[10][,][,];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20,30][,];
    
        for (int j=0; j<abc[i].GetLength(0); j++) {
            for (int k=0; k<abc[i].GetLength(1); k++) {
                abc[i][j,k] = new MyClass[40,50];
            }
        }
    }
    

Beachten Sie, dass die CLR für den Zugriff auf ein eindimensionales Array stark optimiert ist. Daher ist die Verwendung eines gezackten Arrays wahrscheinlich schneller als ein mehrdimensionales Array derselben Größe.

68
thecoop

Ein gezacktes Array ist ein Array von Arrays. Es kann nicht garantiert werden, dass jedes Array dieselbe Größe hat. Du könntest haben 

int[][] jaggedArray = new int[5][];
jaggedArray[0] = { 1, 2, 3 }; // 3 item array
jaggedArray[1] = new int[10]; // 10 item array
// etc.

Es ist ein Satz von verwandten Arrays.

Ein mehrdimensionales Array dagegen ist eher eine zusammenhängende Gruppierung wie Kästchen, Tisch, Würfel usw., in denen keine unregelmäßigen Längen vorhanden sind. Das heißt

int i = array[1,10];
int j = array[2,10]; // 10 will be available at 2 if available at 1
29
Anthony Pegram

Ein rechteckiges Array hat für jede Zeile immer dieselbe Spaltenanzahl.

MyClass[,] x = new MyClass[10,30]

Jede Zeile hat 30 Spalten, wohingegen dies in einem gezackten Array nicht erforderlich ist. Daher denke ich, dass Sie jede 'Zeile' in einem gezackten Array separat initialisieren müssen:

MyClass[][] x = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[30];
}

In der Tat bedeutet dies, dass nicht jede Zeile in dem gezackten Array dieselbe Anzahl von Elementen enthalten muss. (In meinem Beispiel hat es die gleiche Anzahl von Elementen, dies ist jedoch nicht erforderlich).

Sie können dies perfekt tun, zum Beispiel:

MyClass[][] x = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[(30 + i)];
}

Dies könnte für Sie ein interessanter Artikel sein.

7

Ad 3) Um ein solches Monster wie [][,][,] zu initialisieren, kannst du Folgendes tun:

        int [,][,] multiArr1 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                     new int[,] { { 2, 2 }, { 1, 1 } } },
                                     { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } } };
        int [,][,] multiArr2 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                     new int[,] { { 2, 2 }, { 1, 1 } } },
                                     { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } } };

        int [][,][,] superMultiArray = { multiArr1, multiArr2 };
4
nan

Wenn Sie nach einem mehrdimensionalen Array suchen, für das Grenzen festgelegt sind, verwenden Sie immer die [,]-Stil-Syntax. Dadurch wird sichergestellt, dass jeder Teil gleich groß ist.

Wenn Sie [][] verwenden, erstellen Sie ein Array von Arrays. Dies bedeutet dann, dass jedes Array unterschiedlich groß sein kann. Zum Beispiel:

int[][] jaggedArray = new int[5][]
for(int index = 0; index < jaggedArray.Length ; ++index)
{
    jaggedArray[index] = new int[index + 1];
}
1
Joshua Rodgers

Die Inline-Deklaration würde ungefähr so ​​aussehen:

int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };
1
Josiah Ruddell

Zu # 1 siehe diese SO - Frage

Für gezackte oder mehrdimensionale Inline-Arrays siehe diese Programmieranleitung :

// Three-dimensional array.
int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };
// Same array with dimensions specified.
int[, ,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };

Sie müssen keine Dimensionen angeben (array3D), aber wenn Sie wissen, dass sich diese niemals ändern werden, ist es hilfreich zu wissen, welche Dimensionen Sie verwenden (array3Da).

1
rownage

Sie müssten die interne Funktionsweise des Arrays verstehen. Das mehrdimensionale Array fungiert als Array mit einer einzigen Dimension, mit der Ausnahme, dass die doppelte Indizierung in ein einzelnes Array umgewandelt wird.

Ihr gezacktes Array in c # ist ein Array von Objekten, die wiederum Arrays sind.

0
dvhh

Ich denke, dass die 2d-Array-Speicherzuordnung in C # 2d-Arrays in C++ und C .. __ ist. Da 2d-Array-Arrays einen Zeiger haben, der auf ein Array von Zeigern verweist, zeigt jeder dieser Zeiger auf ein Array von Elementen (z. B. Ganzzahlelemente) ); wie dieser Code in C++,

int** 2DArr {new int* [number1]};
for (int i = 0; i < number1; i++)
{
   2DArr[i] = new int[number2];
}

die Speicherzuordnung von Codebalg ist die gleiche wie bei zweidimensionalen Arrays in C #. Aber ich bin zweifelhaft, könnten Sie mir bitte mehr erklären, wenn ich falsch denke.

0
A.salehy

Dieser Beitrag ist alt, aber hier sind meine Gedanken dazu.

Gezackte Arrays sind mehrdimensionale Arrays. Mehrdimensionale Arrays gibt es in zwei Varianten: rechteckig und gezackt. Rechteckige Arrays stellen einen n-dimensionalen Speicherblock dar, und gezackte Arrays sind Arrays von Arrays.

Rechteckige Arrays

Rechteckige Arrays werden durch Kommas zur Trennung der einzelnen Dimensionen deklariert. Die folgende Anweisung deklariert ein rechteckiges zweidimensionales Array mit den Abmessungen 3 × 3:

int[,] matrix = new int [3, 3]; 

gezackte Arrays

Gezackte Arrays werden mit aufeinanderfolgenden eckigen Klammern deklariert, um jede Dimension darzustellen. Hier ist ein Beispiel für das Deklarieren eines gezackten zweidimensionalen Arrays mit einer äußersten Dimension von 3:

int[][] matrix = new int[3][];
0
Imir Hoxha