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

หลักการทำงานของ 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);
}
}
}
อธิบายการทำงานของโปรแกรมตัวอย่าง
เมื่อเริ่มต้น loop ขั้นตอนแรกโปรแกรมจะทำการตรวจสอบค่า ในcollection animals ว่ามีองค์ประกอบใดยังไม่ถูกประมวลผลบ้างซึ่งในครั้งแรก จะพบว่าทุกองค์ประกอบใน animals ยังไม่ถูกประมวลผล คือ("ant", "bird", "lion", "tiger")
หลังจากนั้นจะทำการนำค่าแรกซึ่งคือ 'ant' มาประมวลผลโดยการนำค่ามาเก็บในตัวแปรที่สร้างใหม่คือ animal และทำการประมวลผลใน statement ซึ่งจำทำการพิมพ์ค่าขององค์ประกอบนั้นออกมา คือ 'ant'
หลังจากนั้นจะทำการวนไปเชคในขั้นตอนแรกซึ่งคือตรวจสอบค่าที่ยังไม่ถูกประมวลผลและนำมาใช้ซ้ำไปเรื่อยๆจนเมื่อตรวจสอบว่าไม่มีองค์ประกอบที่ยังไม่ถูกประมวลผลเหลือใน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);
}
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);
}
ข้อจำกัดการใช้งาน 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 + " ");
}
}
}
ข้อจำกัด
การใช้ 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)
ข้อจำกัด
มีข้อจำกัดเรื่องการทำงานไปข้างทีละครั้งเหมือนกัน
แต่ python ไม่มีข้อจำกัดเรื่องการเข้าถึง index แบบเดียวกับ C# เนื่องจาก python มีฟังก์ชั่น enumerate() ซึ่งช่วยติดตามค่า index
และ python สามารถประกาศตัวแปรที่ใช้ได้โดยไม่ต้องระบุชนิดข้อมูลได้ เนื่องจากเป็น dynamic typing
ตัวอย่าง enumerate()
animals = ["lion", "tiger", "choper"]
for count, animal in enumerate(animals):
print (count, animal)
สรุป
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;
สรุป
จากการใช้ 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.
Last updated