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

การวนลูปอาร์เรย์สองมิติ (2D Array) ใน C#

อาร์เรย์สองมิติ (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]