ภาพรวม
Multi-dimensional Arrays (อาร์เรย์หลายมิติ) ใน C# เรียกอีกอย่างว่า Rectangular Arrays (อาร์เรย์สี่เหลี่ยมผืนผ้า) เพราะทุกแถวมีจำนวนคอลัมน์เท่ากันทุกแถว ต่างจาก Jagged Array ที่แต่ละแถวขนาดต่างกันได้
การประกาศ (Declaration)
string[,] names; // 2 มิติ int[,,] cube; // 3 มิติ int[,] matrix = new int[3, 4]; // 3 แถว 4 คอลัมน์
ใช้คอมมา , คั่นมิติภายในวงเล็บ
การเริ่มต้นค่า (Initialization)
// 4 แถว 4 คอลัมน์
int[,] a = new int[4, 4]
{
{ 0, 1, 2, 3 }, // แถว 0
{ 4, 5, 6, 7 }, // แถว 1
{ 8, 9, 10, 11 }, // แถว 2
{ 12, 13, 14, 15 } // แถว 3
};ตัวอย่างโปรแกรม
using System;
namespace Program
{
class Demo
{
static void Main(string[] args)
{
// อาร์เรย์ 5 แถว 2 คอลัมน์
int[,] a = new int[5, 2]
{
{ 0, 0 }, { 1, 2 }, { 2, 4 }, { 3, 6 }, { 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
คุณสมบัติและเมธอดสำคัญ
| เมธอด/Property | คำอธิบาย | ตัวอย่าง |
|---|---|---|
Rank | จำนวนมิติ | a.Rank = 2 |
Length | จำนวนองค์ประกอบทั้งหมด | a.Length = 10 |
GetLength(dimension) | ขนาดของมิติที่ระบุ (0-based) | a.GetLength(0) = 5 (แถว) |
GetLowerBound(dimension) | ดัชนีต่ำสุดของมิติ (มักเป็น 0) | a.GetLowerBound(0) = 0 |
GetUpperBound(dimension) | ดัชนีสูงสุดของมิติ | a.GetUpperBound(1) = 1 |
การเข้าถึงองค์ประกอบ
int value = a[2, 1]; // แถว 2, คอลัมน์ 1 = 4 a[3, 0] = 99; // กำหนดค่า
การวนลูปแบบมาตรฐาน
for (int i = 0; i < arr.GetLength(0); i++) // แถว
{
for (int j = 0; j < arr.GetLength(1); j++) // คอลัมน์
{
Console.Write(arr[i, j] + " ");
}
Console.WriteLine();
}เปรียบเทียบ: Multi-dimensional vs Jagged Array
| คุณสมบัติ | Multi-dimensional [,] | Jagged [][] |
|---|---|---|
| โครงสร้างหน่วยความจำ | Single Block (Contiguous) | Array of Arrays (Non-contiguous) |
| ขนาดแถว | คงที่ (Rectangular) | แตกต่างกันได้ (Ragged) |
| Syntax การเข้าถึง | arr[i, j] | arr[i][j] |
| ประสิทธิภาพ | Cache Friendly, เร็วกว่า | Pointer Chasing, ช้ากว่าเล็กน้อย |
| CLR Support | Standard | Optimized (Special IL) |
| ใช้เมื่อ | Matrix, Grid, Image, Table | Ragged Data, Sparse Matrix |
ข้อสังเกตสำคัญ
- 2D Array เหมาะสำหรับ Matrix Math, Image Processing, Game Board (Chess, Tic-Tac-Toe)
- ไม่สามารถใช้
Array.Sort()โดยตรงได้ (ต้อง Flatten หรือเขียนเอง) foreachวนทีละองค์ประกอบแบบ Row-Major Order- ส่งผ่านเมธอด:
void Method(int[,] arr)- ต้องระบุมิติในพารามิเตอร์