Was ist der Unterschied zwischen einem gezackten Array und einem mehrdimensionalen Array? Gibt es einen Vorteil von einem zum anderen?
Und warum sollte mir das Visual Studio nicht erlauben, a
MyClass[][] abc = new MyClass[10][20];
(Früher haben wir das in C ++ gemacht, aber in C # wird [20] mit einer roten, zappeligen Linie unterstrichen. Sagt einen ungültigen Rangbezeichner.)
ist aber zufrieden mit
MyClass[,] abc = new MyClass[10,20];
Schließlich, wie kann ich dies in einer einzelnen Zeile initialisieren (wie wir es in einfachen Arrays mit tun
{new xxx...}{new xxx....}
)MyClass[][,][,] itemscollection;
c#
.net
arrays
visual-studio-2010
Shekhar_Pro
quelle
quelle
Array
GerätIEnumerable
. Sie können es immer versuchen und selbst sehen :)Antworten:
Ein gezacktes Array ist ein Array von Arrays, also ein
int[][]
Array von Arraysint[]
, von denen jedes unterschiedlich lang sein kann und einen eigenen Block im Speicher belegt. Ein mehrdimensionales Array (int[,]
) ist ein einzelner Speicherblock (im Wesentlichen eine Matrix).Sie können keine erstellen,
MyClass[10][20]
da jedes Subarray separat initialisiert werden muss, da es sich um separate Objekte handelt:A
MyClass[10,20]
ist in Ordnung, da ein einzelnes Objekt als Matrix mit 10 Zeilen und 20 Spalten initialisiert wird.A
MyClass[][,][,]
kann wie folgt initialisiert werden (allerdings nicht kompiliert getestet):Beachten Sie, dass die CLR stark für den Zugriff auf eindimensionale Arrays optimiert ist, sodass die Verwendung eines gezackten Arrays wahrscheinlich schneller ist als die Verwendung eines mehrdimensionalen Arrays derselben Größe.
quelle
var board = new Piece[8, 8];
, eine Transformationsmatrixvar m = new double[2, 2];
.Ein gezacktes Array ist ein Array von Arrays. Es ist nicht garantiert, dass jedes Array dieselbe Größe hat. Du könntest haben
Es ist eine Reihe verwandter Arrays.
Ein mehrdimensionales Array ist dagegen eher eine zusammenhängende Gruppierung wie eine Box, ein Tisch, ein Würfel usw., bei der es keine unregelmäßigen Längen gibt. Das heißt
quelle
jaggedArray[0] = int[3]{ 1, 2, 3 }
;jaggedArray[0] = { 1, 2, 3 };
wenn ich es in= new[] { 1, 2, 3 }
(oder= new int[] { 1, 2, 3 }
vor C # 3.0) ändere . Im C # -Programmierhandbuch von Microsoft heißt es: "Sie können eine Array-Variable deklarieren, ohne sie zu erstellen. Sie müssen jedoch den neuen Operator verwenden, wenn Sie dieser Variablen ein neues Array zuweisen."Ein rechteckiges Array hat immer die gleiche Anzahl von Spalten für jede Zeile.
Jede Zeile hat 30 Spalten, während dies in einem gezackten Array nicht erforderlich ist. Daher denke ich, dass Sie jede 'Zeile' in einem gezackten Array separat initialisieren müssen:
Tatsächlich bedeutet dies, dass nicht jede Zeile im gezackten Array die gleiche Anzahl von Elementen enthalten muss. (In meinem Beispiel hat es die gleiche Anzahl von Elementen, aber dies ist nicht erforderlich).
Sie können dies perfekt tun, zum Beispiel:
Dies könnte ein interessanter Artikel für Sie sein.
quelle
Anzeige 3) Um ein solches Monster wie zu initialisieren
[][,][,]
, können Sie Folgendes tun:quelle
Wenn Sie nach einem mehrdimensionalen Array suchen, für das Grenzen festgelegt wurden, verwenden Sie immer die
[,]
Stilsyntax. Dadurch wird sichergestellt, dass jede Portion gleich groß ist.Wenn Sie verwenden,
[][]
ist es wirklich so, dass Sie ein Array von Arrays erstellen. Dies bedeutet dann, dass jedes Array unterschiedlich dimensioniert werden kann. Beispielsweise:quelle
Die Inline-Deklaration würde ungefähr so aussehen:
quelle
Für # 1 siehe diese SO-Frage
Informationen zu gezackten oder mehrdimensionalen Inline-Arrays finden Sie in dieser Programmieranleitung :
Sie müssen die Dimensionen nicht angeben (array3D), aber wenn Sie wissen, dass sie sich nie ändern werden, ist es hilfreich zu wissen, welche Dimensionen Sie verwenden (array3Da).
quelle
Sie müssen die interne Funktionsweise des Arrays verstehen. Das mehrdimensionale Array fungiert als eindimensionales Array, mit der Ausnahme, dass die Doppelindizierung in eine einzelne konvertiert wird.
Ihr gezacktes Array in c # ist ein Array von Objekten, die abwechselnd Arrays sind.
quelle
Ich denke, dass die Speicherzuordnung von 2d-gezackten Arrays in C # wie 2d-Arrays in C ++ und C ist. Da 2d-gezackte Arrays einen Zeiger haben, der auf ein Array von Zeigern zeigt, zeigt jeder dieser Zeiger auf ein Array von Elementen (zum Beispiel ganzzahlige Elemente); wie dieser Code in C ++,
Die Speicherzuordnung des folgenden Codes entspricht der von 2d gezackten Arrays in C #. Aber ich bin mir nicht sicher, könnten Sie bitte mehr erklären, wenn ich falsch denke.
quelle
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 Anordnungen
Rechteckige Arrays werden durch Kommas deklariert, um jede Dimension zu trennen. Die folgende Anweisung deklariert ein rechteckiges zweidimensionales Array mit den Abmessungen 3 × 3:
Gezackte Arrays
Gezackte Arrays werden mit aufeinanderfolgenden eckigen Klammern deklariert, um jede Dimension darzustellen. Hier ist ein Beispiel für die Deklaration eines gezackten zweidimensionalen Arrays, wobei die äußerste Dimension 3 ist:
quelle
Stellen Sie sich für ein mehrdimensionales Array eine Box oder ein Rechteck vor. Jede Zeile hat die gleiche Länge und jede Spalte die gleiche Länge.
In einem gezackten Array sind die Zeilen und Spalten möglicherweise nicht gleich groß. Beispielsweise können die Spalten oder Zeilen unterschiedliche Größen haben. Dies würde zu einer Form führen, die möglicherweise keine gerade Linie an den Seiten wie ein Rechteck ist. Stattdessen können die Seiten gezackt sein .
Jetzt habe ich für dieses Beispiel 2 Dimensionen / 2 Arrays verwendet, aber dies gilt für mehr.
quelle