ภาพรวม
Jagged Array (อาร์เรย์ขี้ขลาด/อาร์เรย์ของอาร์เรย์) คือ อาร์เรย์ที่แต่ละองค์ประกอบเป็นอาร์เรย์อีกทีหนึ่ง โดยอาร์เรย์ย่อยแต่ละตัวสามารถมี ขนาดต่างกัน ได้ (ต่างจาก Multi-dimensional Array ที่เป็นรูปสี่เหลี่ยมผืนผ้า)
การประกาศ (Declaration)
int[][] scores; // อาร์เรย์ของ int[]
เครื่องหมาย [][] หมายถึง อาร์เรย์ของอาร์เรย์
ตัวอย่างโปรแกรม: ประกาศ เริ่มต้น และเข้าถึง
using System;
namespace ArrayApplication
{
class MyArray
{
static void Main(string[] args)
{
// Jagged Array: 5 แถว, แต่ละแถวมี 2 คอลัมน์ (ในตัวอย่างนี้เท่ากัน แต่สามารถต่างกันได้)
int[][] a = new int[][]
{
new int[] { 0, 0 },
new int[] { 1, 2 },
new int[] { 2, 4 },
new int[] { 3, 6 },
new int[] { 4, 8 }
};
int i, j;
// วนลูปเข้าถึง: a[i][j] (สองช่วงวงเล็บ)
for (i = 0; i < 5; i++)
{
for (j = 0; j < 2; j++)
{
Console.WriteLine("a[{0}][{1}] = {2}", i, j, a[i][j]);
}
}
Console.ReadKey();
}
}
}ผลลัพธ์
a[0][0] = 0 a[0][1] = 0 a[1][0] = 1 a[1][1] = 2 a[2][0] = 2 a[2][1] = 4 a[3][0] = 3 a[3][1] = 6 a[4][0] = 4 a[4][1] = 8
Jagged Array ขนาดไม่เท่ากัน (True Jagged)
// แต่ละแถวมีขนาดต่างกัน
int[][] jagged = new int[3][];
jagged[0] = new int[] { 1, 2, 3 }; // 3 องค์ประกอบ
jagged[1] = new int[] { 4, 5 }; // 2 องค์ประกอบ
jagged[2] = new int[] { 6, 7, 8, 9 }; // 4 องค์ประกอบ
// การเข้าถึงต้องใช้ Length ของแต่ละแถว
for (int i = 0; i < jagged.Length; i++)
{
for (int j = 0; j < jagged[i].Length; j++)
Console.Write(jagged[i][j] + " ");
Console.WriteLine();
}ผลลัพธ์ Jagged จริง
1 2 3 4 5 6 7 8 9
เปรียบเทียบ: Jagged Array vs Multi-dimensional Array
| คุณสมบัติ | Jagged Array ([][]) | Multi-dimensional Array ([,]) |
|---|---|---|
| รูปร่าง | แถวแต่ละแถวขนาดต่างกันได้ | สี่เหลี่ยมผืนผ้า (Rectangular) |
| หน่วยความจำ | ไม่ต่อเนื่อง (Array of Arrays) | ต่อเนื่อง (Single Block) |
| การเข้าถึง | a[i][j] (Two dereferences) | a[i,j] (Single index calculation) |
| ประสิทธิภาพ | ช้ากว่าเล็กน้อย (Pointer chasing) | เร็วกว่า (Cache friendly) |
| CLR Optimization | ดีกว่าใน .NET (Special IL Instructions) | Standard |
| ใช้เมื่อไหร่ | ข้อมูลแถวขนาดไม่เท่ากัน, Ragged data | Matrix, Grid, Image, Table |
ข้อสังเกตสำคัญ
- Jagged Array ใน .NET มี Performance ดีกว่าที่คิด เพราะ CLR มี Instruction เฉพาะ (
ldelem,stelem) - 初始化:
new int[3][]สร้างอาร์เรย์ภายนอก 3 ช่อง (null) ต้อง new อาร์เรย์ในแต่ละช่องแยกกัน - เข้าถึง:
jagged[i][j]ไม่ใช่jagged[i,j] - ใช้
jagged[i].Lengthสำหรับขนาดแถวที่ i