Foreach

ชลันธร การดำริห์ 650710535

Looping ในภาษาโปรแกรมคือวิธีการดำเนินการคำสั่งหรือชุดของคำสั่งซ้ำหลายครั้งขึ้นอยู่กับเงื่อนไขที่ใช้ โดยเงื่อนไขต้องเป็นจริงเพื่อทำการวนซ้ำ (loop)

Foreach Loop ใน C#

การ loop แบบ foreach ในภาษา C# จะเป็นการวนซ้ำผ่าน Element(องค์ประกอบ) ของ Collection โดยทั่วไปจะใช้กับ colletion ที่เป็น โดยอาจเป็น array หรือ list โดยจะดำเนินการคำสั่งที่กำหนดไว้กับแต่ละ element ที่มีอยู่ในอาเรย์นั้นทีละตัว

flowchart การทำงานของ foreach

ภาพจาก geeksforgeeks.org

หลักการทำงานของ foreach จาก flowchart

เมื่อเริ่มต้น(start) โปรแกรมจะทำการตรวจสอบองค์ประกอบใน collection ว่ามีองค์ประกอบใดยังไม่ประมวลผลหรือไม่ หากมีจำดำเนินการนำค่าที่ยังไม่ได้ประมวลผลมาใช้ และทำงานตามคำสั่งในstatement และทำการวนซ้ำ จนกว่าจะไม่มีค่าองค์ประกอบใน collection แล้วจึง หยุดการทำงาน(stop)

Syntax foreach ใน ภาษา C#

foreach(data_type var_name in collection_variable)
{
     // statements to be executed
}

องค์ประกอบหลัก

  • data_type คือ type ของข้อมูลใน collection ที่ต้องการวนซ้ำ เช่น int char string เป็นต้น

  • var_name คือ ชื่อตัวแปรที่สร้างขึ้นเพื่อใช้อ้างถึงองค์ประกอบ ใน collection ในระหว่างการวนซ้ำ

  • collection_variable คือ ตัวแปรของ collection ที่คุณต้องการวนซ้ำ

  • statement คือ คำสั่งที่ต้องการให้โปรแกรมทำงานใน loop

การใช้ foreach loop ใน C# เบื้องต้น

  • ต้องใส่คำสั่งของ loop ไว้ในปีกา { statement }

foreach(){ 
  // คำสั่งที่ต้องการให้ทำงาน
}
  • ประกาศตัวแปรประเภทเดียวกับ collection แทนที่จะประกาศตัวนับ(loop counter)

ตัวอย่าง
// สร้าง collection array ประเภท int
int[] numbers = { 1, 2, 3, 4, 5 };

//กรณีลูป for ปกติ
for(int i=0;i<numbers.Length;i++){ //การประกาศตัวนับ
        //statement
        }
        
//กรณีลูป foreach
foreach (int variable in numbers) {  // ประกาศตัวแปร type เป็น int
        //statement
        }

ในอีกกรณี เราสามารถประกาศประเภทของตัวแปรเป็น var ได้ โดยไม่ต้องระบุประเภทอย่างชัดเจน compiler จะทำการอนุมานตัวแปรให้โดยอัตโนมัติ

ตัวอย่าง
// สร้าง collection array ประเภท int
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (var variable in numbers) { // ประกาศตัวแปร type เป็น var แทนที่จะเป็น int
        //statement
    }
  • สามารถใช้ตัวแปรที่สร้างขึ้นมาใหม่ แทนการเข้าถึงองค์ประกอบได้ด้วยค่า ดัชนี

// จากโค้ดในข้อประกาศตัวแปร
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int variable in numbers) { 
    Console.WriteLine(variable); //ใช้ตัวแปร variable แทนการเข้าถึง index ของarray
    //ไม่จำเป็นต้องเข้าถึง numbers[i]
}

ตัวอย่างการใช้งาน

sing System;
class Program{
    static void Main(){
        // กำหนดอาเรย์ของสัตว์
        string[] animals = { "ant", "bird", "lion", "tiger"};
        
        // ใช้ foreach เพื่อวนซ้ำผ่านองค์ประกอบในอาเรย์
        foreach (string animal in animals){
            // แสดงผลแต่ละองค์ประกอบ
            Console.WriteLine(animal);
        }
    }
}
ผลลัพธ์

ant

bird

lion

tiger

อธิบายการทำงานของโปรแกรมตัวอย่าง

  1. เมื่อเริ่มต้น loop ขั้นตอนแรกโปรแกรมจะทำการตรวจสอบค่า ในcollection animals ว่ามีองค์ประกอบใดยังไม่ถูกประมวลผลบ้างซึ่งในครั้งแรก จะพบว่าทุกองค์ประกอบใน animals ยังไม่ถูกประมวลผล คือ("ant", "bird", "lion", "tiger")

  2. หลังจากนั้นจะทำการนำค่าแรกซึ่งคือ 'ant' มาประมวลผลโดยการนำค่ามาเก็บในตัวแปรที่สร้างใหม่คือ animal และทำการประมวลผลใน statement ซึ่งจำทำการพิมพ์ค่าขององค์ประกอบนั้นออกมา คือ 'ant'

  3. หลังจากนั้นจะทำการวนไปเชคในขั้นตอนแรกซึ่งคือตรวจสอบค่าที่ยังไม่ถูกประมวลผลและนำมาใช้ซ้ำไปเรื่อยๆจนเมื่อตรวจสอบว่าไม่มีองค์ประกอบที่ยังไม่ถูกประมวลผลเหลือในcollection แล้วจึงหยุดการทำงานของ loop

ทั้งนี้ โครงสร้าง(structure) foreach ยังสามารถใช้ได้ใน collection อื่นๆอีก เช่น list หรือdictionary

//การใช้ foreach กับ dictionary
foreach (KeyValuePair<data_type, data_type> name in dictionary_collection)
            {
                        //statement
            }

ตัวอย่าง

Dictionary<string, int> scores = new Dictionary<string, int>
        {
            { "Alice", 90 },
            { "Bob", 85 },
            { "Charlie", 92 }
        };
// ใช้ KeyValuePair เพื่อวนลูปผ่าน Dictionary
foreach (KeyValuePair<string, int> pair in scores){
        Console.WriteLine($"ชื่อ: {pair.Key}, คะแนน: {pair.Value}");
    }

การใช้foreach กับ list และ array มีรูปแบบการประกาศตัวแปรที่เหมือนกัน แม้ว่าจะมีประเภทข้อมูลที่แตกต่างกัน

Skip and Break of foreach

Skip ข้ามการทำงานใน loop

เราสามารถใช้คำสั่ง 'continue' ร่วมกับคำสั่งควบคุม เช่น if-else เพื่อกำหนดเงื่อนไขใน statement เพื่อข้ามการทำงานหรือการวนซ้ำได้

string[] animals = { "ant", "bird", "lion", "tiger"};
        foreach (string animal in animals){
                if(animal == "ant"){
                        continue; //ข้ามเมื่อพบว่าองค์ประกอบที่ประมวลผลเป็น ant
                }
                Console.WriteLine(animal);
        }
ผลลัพธ์

bird

lion

tiger

Break หยุดการทำงานใน loop

เราสามารถใช้คำสั่ง 'break' ร่วมกับคำสั่งควบคุม เช่น if-else เพื่อกำหนดเงื่อนไขใน statement เพื่อหยุดการทำงานหรือการวนซ้ำได้

string[] animals = { "ant", "bird", "lion", "tiger"};
        foreach (string animal in animals){
                if(animal == "lion"){
                        break; //หยุดการทำงานเมื่อพบว่าองค์ประกอบที่ประมวลผลเป็น lion
                }
                Console.WriteLine(animal);
        }
ผลลัพธ์

ant

bird

ข้อจำกัดการใช้งาน foreach loop ของC#

  • การใช้ foreach loop ไม่เหมาะสมกับการแก้ไขข้อมูลใน array เนื่องจากออกแบบมาสำหรับอ่านเท่านั้น

ตัวอย่าง
int[] numbers = { 10, 20, 30, 40, 50 };
foreach (var num in numbers)
{
    num *= 2;  // ไม่สามารถแก้ไขค่าใน array ได้ เพราะเป็นการแก้ไขสำเนา (copy) ของค่า
}
  • foreach loop ไม่มีการติดตามค่า ดัชนี (index) จึงไม่สามารถนำค่า ดัชนีมาใช้ได้

int[] numbers = { 10, 20, 30, 40, 50 };

// พยายามเข้าถึงดัชนีใน foreach loop
foreach (var num_index in numbers)
{
    Console.WriteLine($"Index: {num}");
}
  • foreach loop จะทำงานไปข้างหน้าทีละครั้งเท่านั้น ไม่สามารถย้อนกลับได้

foreach loop จะทำการดำเนินไปข้างหน้าทีละหนึ่งครั้งเท่านั้น และจะไม่สามารถย้อนกลับหรือเปลี่ยนตำแหน่งของ loop ที่ต้องการจะไปได้

int[] numbers = { 10, 20, 30, 40, 50 };
//พยายามขยับข้ามการทำงานไปหนึ่งครั้ง
foreach (int num in numbers)
{
    num+=1;
}

//หรือเข้าถึงตัวแปรก่อนหน้า
foreach (int num in numbers)
{
    Console.WriteLine(num[-1]); 
}

เปรียบเทียบ foreach ใน C, Java ,python

JAVA foreach loop

ใน Java มีโครงสร้าง Foreach สำหรับวนซ้ำข้อมูลใน collection คล้ายกับใน C#

โดยในภาษาjava จะใช้keyword 'for' ในการใช้งาน หลังจากนั้นจะทำการประกาศตัวแปร และcollection โดยคั่นด้วย colon(:)

syntax

for (type var_name : collection_variable) { 
    //statement
}

ตัวอย่างการใช้งาน

class Easy{
    public static void main(String[] args){
        // array declaration
        int ar[] = { 10, 50, 60, 80, 90 };
        for (int element : ar){
            System.out.print(element + " ");
            }
    }
}
ผลลัพธ์

10 50 60 80 90

ข้อจำกัด

  • การใช้ foreach loop ไม่เหมาะสมกับการแก้ไขข้อมูลใน array เนื่องจากออกแบบมาสำหรับอ่านเท่านั้น

  • foreach loop ไม่มีการติดตามค่า ดัชนี (index) จึงไม่สามารถนำค่า ดัชนีมาใช้ได้

  • foreach loop จะทำงานไปข้างหน้าทีละครั้งเท่านั้น

  • foreach loop ไม่สามารถประมวลผลคำสั่งตัดสินใจสองคำสั่งพร้อมกันได้

สรุป

การใช้งาน foreach ในภาษาjava มีความคล้ายกับ C# ในเรื่องการใช้งาน และมีข้อจำกัดหลัก ๆ ที่เหมือนกัน คือ การใช้ foreach loop ไม่เหมาะสมกับการแก้ไขข้อมูลใน array หรือ collection foreach loop ไม่ได้ติดตามค่า ดัชนี (index) จึงไม่สามารถนำค่า ดัชนีมาใช้ได้ และ จะทำงานไปข้างหน้าทีละครั้งเท่านั้น

Python foreach Loop

ใน Python ไม่มีคำสั่ง foreach แต่สามารถใช้คำสั่ง for ในการวนลูป element ใน collection แต่จะใช้กับ collection ซึ่งทำหน้าที่เหมือน foreach ในภาษาอื่นๆ

syntax

for var in collection:
    # statements

ตัวอย่างการใช้งาน

animals = ["ant", "bird", "lion", "tiger"]
for animal in animals:
    print(animal)
ผลลัพธ์

ant

bird

lion

tiger

ข้อจำกัด

มีข้อจำกัดเรื่องการทำงานไปข้างทีละครั้งเหมือนกัน

แต่ python ไม่มีข้อจำกัดเรื่องการเข้าถึง index แบบเดียวกับ C# เนื่องจาก python มีฟังก์ชั่น enumerate() ซึ่งช่วยติดตามค่า index

และ python สามารถประกาศตัวแปรที่ใช้ได้โดยไม่ต้องระบุชนิดข้อมูลได้ เนื่องจากเป็น dynamic typing

ตัวอย่าง enumerate()

animals = ["lion", "tiger", "choper"]
for count, animal in enumerate(animals):
    print (count, animal)
ผลลัพธ์

0 lion

1 tiger

2 choper

สรุป

python สามารถใช้การวนซ้ำผ่าน collection ได้เหมือนกัน โดยจะมีข้อจำกัดบางข้อที่เหมือนกัน เช่น การทำงานแบบทีละครั้ง และจะมีข้อจำกัดบางอย่างที่แตกต่าง เช่น python สามารถประกาศตัวแปรที่ใช้ได้โดยไม่ต้องระบุชนิดข้อมูลได้ python สามารถติดตามค่าดัชนีได้ ผ่านการใช้ฟังก์ชั่น enumerate()

C foreach Loop

ในภาษา C ไม่มีคำสั่งสำหรับการ foreach โดยตรง ต้องใช้การลูปอื่น เช่น for loop เพื่อวนรอบข้อมูลผ่าน collection ได้

ตัวอย่างการใช้ for

#include <stdio.h>
int main() {
    int numbers[] = {1, 2, 3, 4, 5}; // สร้างอาร์เรย์
    int length = sizeof(numbers) / sizeof(numbers[0]); // หาขนาดของอาร์เรย์
    // ใช้ for loop เพื่อวนรอบอาร์เรย์
    for (int i = 0; i < length; i++) {
        printf("%s\n", animals[i]); // แสดงผล
    }
    return 0;
ผลลัพธ์

1

2

3

4

5

สรุป

จากการใช้ loop for ทำให้เห็นได้ว่าสามารถเข้าถึง index ของข้อมูลได้ และสามารถแก้ไขข้อมูลได้ หรือแก้ไขการนับของloop ได้ทำให้ไม่มีข้อจำกัดเช่นเดียวกับ foreach ของ C# ซึ่งยืดหยุ่นสูงกว่า แต่จะสังเกตุได้ว่า code ที่ได้ยากและซับซ้อนกว่า เมื่อเปรียบเทียบกับ foreach ของ C#

สรุปความแตกต่างระหว่าง For loop กับ Foreach loop

  • For loop จะทำงานตามคำสั่งจนกว่าเงื่อนไขที่กำหนดจะเป็นเท็จ ในขณะที่ foreach loop จะทำงานตามคำสั่งสำหรับแต่ละองค์ประกอบที่มีอยู่ในอาร์เรย์ โดยไม่จำเป็นต้องกำหนดขีดจำกัดขั้นต่ำหรือสูงสุด

  • ใน for loop เราสามารถวนซ้ำอาร์เรย์ได้ทั้งในทิศทางไปข้างหน้าและถอยหลัง foreach loop เช่น จากดัชนี 0 ถึง 9 และจากดัชนี 9 ไป 0 เราจะวนซ้ำอาร์เรย์ได้เพียงในทิศทางไปข้างหน้าเท่านั้น

  • Foreach loop จะทำการคัดลอกอาร์เรย์และนำสำเนานั้นไปใช้ในการดำเนินการ ในขณะที่ for loop จะทำงานกับอาร์เรย์เดิมโดยไม่ทำการคัดลอกข้อมูลใด ๆ

กรณีที่เหมาะสมกับการใช้ foreach ในการทำงาน

  • เมื่อต้องการอ่านค่าจาก collection เท่านั้นโดยไม่ต้องการเปลี่ยนแปลงค่า

  • ต้องการวนซ้ำข้อมูลผ่านทุกองค์ประกอบของ collection

  • ไม่มีการจัดการกับดัชนีตัวแปร ซึ่งช่วยลดความซับซ้อนในการเขียน

SLIDE PRESENTATION

VIDEO PRESENTATION

REFERENCE

C#

GeeksforGeeks. (2019, August 6). C# foreach loop. GeeksforGeeks. https://www.geeksforgeeks.org/c-sharp-foreach-loop/

Microsoft. (2023, March 14). Implicitly typed local variables. Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables

Microsoft. (n.d.). IEnumerable interface. Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/api/system.collections.ienumerable?view=net-8.0

Microsoft. (2023, November 15). Iteration statements - for, foreach, do, and while. Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/iteration-statements

Ravikiran, A. S. (2024, October 11). Mastering foreach in C#. Simplilearn. https://www.simplilearn.com/tutorials/c-sharp-tutorial/c-sharp-foreach

Python

GeeksforGeeks. (2024, September 13). For loops in Python. GeeksforGeeks.https://www.geeksforgeeks.org/python-for-loops/

GeeksforGeeks. (2023, September 11). How to access index in Python’s for loop. GeeksforGeeks.https://www.geeksforgeeks.org/how-to-access-index-in-pythons-for-loop/

w3schools. (n.d.). Python iterators. W3Schools.https://www.w3schools.com/python/python_iterators.asp

Java

GeeksforGeeks. (2024, October 04). For-each loop in Java. GeeksforGeeks.https://www.geeksforgeeks.org/for-each-loop-in-java/

C

GeeksforGeeks. (2023, June 28). C for Loop. GeeksforGeeks.

https://www.geeksforgeeks.org/c-for-loop/

Last updated