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

การประกาศ Jagged Array ใน C#

ภาพรวม

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 dataMatrix, 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