อาร์เรย์สองมิติ (2D Array) ใน C# ประกาศด้วย T[,] ใช้ GetUpperBound(dimension) หรือ GetLength(dimension) เพื่อหาขอบเขตสำหรับการวนลูป
การประกาศและกำหนดค่า
// ประกาศขนาด 3x3
string[,] array = new string[3, 3];
// กำหนดค่า
array[0, 0] = "One"; array[0, 1] = "Two"; array[0, 2] = "Three";
array[1, 0] = "Four"; array[1, 1] = "Five"; array[1, 2] = "Six";
array[2, 0] = "Seven"; array[2, 1] = "Eight"; array[2, 2] = "Nine";
// หรือ Initializer Syntax
string[,] array2 =
{
{ "One", "Two", "Three" },
{ "Four", "Five", "Six" },
{ "Seven", "Eight", "Nine" }
};
โค้ดตัวอย่างสมบูรณ์: วนลูปแบบต่างๆ
using System;
public class Demo
{
public static void Main()
{
string[,] array =
{
{ "One", "Two", "Three" },
{ "Four", "Five", "Six" },
{ "Seven", "Eight", "Nine" }
};
Console.WriteLine("=== วิธี 1: for loop ด้วย GetUpperBound ===");
int rows = array.GetUpperBound(0) + 1; // หรือ array.GetLength(0)
int cols = array.GetUpperBound(1) + 1; // หรือ array.GetLength(1)
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
Console.Write($"[{i},{j}]={array[i,j]} ");
}
Console.WriteLine();
}
Console.WriteLine("\n=== วิธี 2: foreach (เรียงตามแถว) ===");
foreach (string item in array)
{
Console.Write($"{item} ");
}
Console.WriteLine();
Console.WriteLine("\n=== วิธี 3: for loop ด้วย GetLength (แนะนำ) ===");
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
Console.Write($"{array[i,j],-8}");
}
Console.WriteLine();
}
Console.WriteLine("\n=== วิธี 4: Cast เป็น IEnumerable (LINQ) ===");
var allItems = array.Cast();
Console.WriteLine($"จำนวนทั้งหมด: {allItems.Count()}");
Console.WriteLine($"รวมข้อความ: {string.Join(" ", allItems)}");
}
}
ผลลัพธ์
=== วิธี 1: for loop ด้วย GetUpperBound ===
[0,0]=One [0,1]=Two [0,2]=Three
[1,0]=Four [1,1]=Five [1,2]=Six
[2,0]=Seven [2,1]=Eight [2,2]=Nine
=== วิธี 2: foreach (เรียงตามแถว) ===
One Two Three Four Five Six Seven Eight Nine
=== วิธี 3: for loop ด้วย GetLength (แนะนำ) ===
One Two Three
Four Five Six
Seven Eight Nine
=== วิธี 4: Cast เป็น IEnumerable (LINQ) ===
จำนวนทั้งหมด: 9
รวมข้อความ: One Two Three Four Five Six Seven Eight Nine
GetUpperBound vs GetLength
| เมธอด | คืนค่า | ใช้กับ Loop |
|---|---|---|
GetUpperBound(d) | ดัชนีสูงสุด (0-based) | i <= GetUpperBound(0) หรือ i < GetUpperBound(0) + 1 |
GetLength(d) | จำนวนองค์ประกอบ | i < GetLength(0) (เข้าใจง่ายกว่า) |
แนะนำ: ใช้ GetLength(dimension) มากกว่า เพราะอ่านง่ายและตรงไปตรงมา
อาร์เรย์จัตุรัส (Jagged Array) - ทางเลือกอื่น
// Jagged Array: อาร์เรย์ของอาร์เรย์ (แต่ละแถวมีความยาวต่างกันได้)
string[][] jagged = new string[3][];
jagged[0] = new[] { "One", "Two" };
jagged[1] = new[] { "Three", "Four", "Five" };
jagged[2] = new[] { "Six" };
// วนลูป Jagged Array
for (int i = 0; i < jagged.Length; i++)
{
for (int j = 0; j < jagged[i].Length; j++)
{
Console.Write($"{jagged[i][j]} ");
}
Console.WriteLine();
}
การใช้งานจริง: Matrix Operations
int[,] matrix =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
// Transpose
int rows = matrix.GetLength(0);
int cols = matrix.GetLength(1);
int[,] transposed = new int[cols, rows];
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
transposed[j, i] = matrix[i, j];
// Sum ทุกค่า
int sum = 0;
foreach (int val in matrix) sum += val; // 45
ข้อควรระวัง
- อาร์เรย์ 2D จัดเก็บในหน่วยความจำแบบต่อเนื่อง (Row-major order) - เร็วกว่า Jagged Array
GetLength(0)= จำนวนแถว (Rows),GetLength(1)= จำนวนคอลัมน์ (Columns)foreachวนตามแถว (Row-major) - แถวแรกจบค่อยไปแถวถัดไป- ไม่สามารถใช้
array.Lengthได้ (คืนจำนวนทั้งหมด ไม่ใช่จำนวนแถว) - ดัชนีเริ่มต้นที่ 0:
[0,0]ถึง[rows-1, cols-1]