Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

ความแตกต่างระหว่าง Multi-dimensional Array และ Jagged Array ใน C#

Multi-dimensional Array (Rectangular Array)

อาเรย์หลายมิติที่มีขนาดคงที่ในทุกมิติ (Rectangular) - ทุกแถวมีจำนวนคอลัมน์เท่ากัน

Syntax และการประกาศ

// 2 มิติ (2D) - 3 แถว 4 คอลัมน์
int[,] matrix = new int[3, 4];

// 3 มิติ (3D) - 2x3x4
int[,,] cube = new int[2, 3, 4];

// Initialization
int[,] matrix2 = new int[,] {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};

การเข้าถึงข้อมูล

int value = matrix[1, 2]; // แถว 1 คอลัมน์ 2 (0-based)
matrix[0, 0] = 100;

// วนลูป
for (int i = 0; i < matrix.GetLength(0); i++) {      // Rows
    for (int j = 0; j < matrix.GetLength(1); j++) {  // Columns
        Console.Write(matrix[i, j] + " ");
    }
    Console.WriteLine();
}

Jagged Array (Array of Arrays)

อาเรย์ของอาเรย์ - แต่ละแถวเป็น Array แยกกัน สามารถมีขนาดต่างกันได้ (Ragged/Ragged)

Syntax และการประกาศ

// Jagged Array - 4 แถว ขนาดต่างกัน
int[][] jagged = new int[4][];
jagged[0] = new int[] { 1, 2 };
jagged[1] = new int[] { 3, 4, 5, 6 };
jagged[2] = new int[] { 7 };
jagged[3] = new int[] { 8, 9, 10 };

// หรือ Initialize ทีเดียว
int[][] jagged2 = new int[][] {
    new int[] { 0, 0 },
    new int[] { 1, 2 },
    new int[] { 2, 4 },
    new int[] { 3, 6 }
};

การเข้าถึงข้อมูล

int value = jagged[1][2]; // แถว 1, คอลัมน์ 2 = 5

// วนลูป - แต่ละแถวอาจมีขนาดต่างกัน
for (int i = 0; i < jagged.Length; i++) {
    for (int j = 0; j < jagged[i].Length; j++) {
        Console.Write(jagged[i][j] + " ");
    }
    Console.WriteLine();
}

ตารางเปรียบเทียบสรุป

คุณสมบัติ Multi-dimensional Array Jagged Array
Syntax int[,] int[,,] int[][] int[][][]
หน่วยความจำ Per Block (Contiguous) Array of References + Separate Arrays
ขนาดแถว คงที่ (Rectangular) แตกต่างกันได้ (Ragged)
Rank (Rank Property) > 1 (เช่น 2, 3) 1 (เสมอ - เป็น Array ของ Array)
GetLength() GetLength(0), GetLength(1) Length (Outer), arr[i].Length (Inner)
ประสิทธิภาพ ดีกว่า (Cache Friendly) ช้ากว่าเล็กน้อย (Indirection)
CLS Compliant ✅ ❌ (ไม่ใช่ CLS Compliant)
เหมาะสำหรับ Matrix, Grid, Image, Table Sparse Data, Variable Row Size

ตัวอย่างเปรียบเทียบหน่วยความจำ

// Multi-dimensional: 1 Block Memory
int[,] multi = new int[1000, 1000]; // ~4 MB contiguous

// Jagged: 1000 Arrays + 1 Array of References
int[][] jagged = new int[1000][];
for (int i = 0; i < 1000; i++) {
    jagged[i] = new int[1000]; // 1000 separate allocations
}

เมื่อไหร่ควรใช้อะไร?

  • Multi-dimensional: Matrix คณิตศาสตร์, Image Processing, Game Board, Spreadsheet - ข้อมูลสี่เหลี่ยมผืนผ้า
  • Jagged Array: Sparse Matrix, ไฟล์ CSV ที่แถวไม่เท่ากัน, Tree Structures, Adjacency List - ขนาดแถวแตกต่างกัน