การแทนที่การวนซ้ำอาร์เรย์ for... if
ใน C#
หากคุณเป็นนักพัฒนาที่เคยทำงานกับอาร์เรย์และลูปใน C# คุณอาจเผชิญกับสถานการณ์ที่คุณจำเป็นต้องวนซ้ำผ่านอาร์เรย์และใช้การแปลงบางอย่างตามเงื่อนไข ในขณะที่การวนซ้ำอย่างง่ายด้วย foreach
อาจดูเหมือนเป็นการทำที่เข้าใจได้ แต่บ่อยครั้งก็ส่งผลให้เกิดวิธีการที่ไม่ประณีต ในโพสต์นี้เราจะสำรวจปัญหาที่พบบ่อยจากการใช้ foreach
ร่วมกับเงื่อนไข และนำเสนอทางเลือกที่มีประสิทธิภาพซึ่งสามารถปรับปรุงรหัสของคุณให้ดีขึ้น เช่นเดียวกับการสร้างรายการใน Python
ปัญหาของ foreach
พิจารณาลูป foreach
ต่อไปนี้ ซึ่งจะเพิ่มค่าลงในอาร์เรย์ตามเงื่อนไข:
foreach (int x in intArray)
if (x > 3) // เงื่อนไขทั่วไปใน x
x++;
// ทำการประมวลผลอื่น ๆ
ข้อชี้แจงปัญหา
- ข้อจำกัดในการแก้ไข: ปัญหาหลักคือการดำเนินการเพิ่มที่
x
ไม่ได้แก้ไขเนื้อหาของอาร์เรย์ต้นฉบับ ดังนั้นวิธีนี้จึงไม่สามารถบรรลุผลที่ต้องการในการอัปเดตค่าของintArray
ตามที่คุณคาดหวัง
การใช้ลูป for
แบบดั้งเดิม
เพื่อปรับปรุงเนื้อหาของอาร์เรย์ได้อย่างมีประสิทธิภาพ คุณควรใช้ลูป for
แบบดั้งเดิม นี่คือวิธีการนำไปใช้:
for(int i = 0; i < intArray.Length; ++i)
{
if(intArray[i] > 3)
++intArray[i];
}
ข้อดีของลูป for
- การแก้ไขโดยตรง: วิธีนี้ช่วยให้คุณสามารถปรับเปลี่ยนส่วนประกอบของอาร์เรย์โดยตรง ทำให้แน่ใจว่าการเปลี่ยนแปลงจะมีผลทันทีภายในอาร์เรย์เอง
- ความยืดหยุ่น: คุณสามารถจัดการกับดัชนีได้ง่ายและดำเนินการตรรกะที่ซับซ้อนมากขึ้นตามที่ต้องการ
การใช้ LINQ สำหรับการแปลง
LINQ (Language Integrated Query) ยังสามารถให้วิธีการวนซ้ำผ่านอาร์เรย์ แม้ว่ามันจะมุ่งเน้นไปที่การสร้างลำดับใหม่จากลำดับที่มีอยู่ มากกว่าการปรับเปลี่ยนในที่นั้น นี่คือตัวอย่างสองสามตัวอย่าง:
การใช้ LINQ ในการแปลงข้อมูล
เพื่อสร้างอาร์เรย์ที่ถูกแปลงใหม่ คุณสามารถใช้ LINQ ดังนี้:
var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));
ตัวอย่างที่มี where
คลอส
ถ้าคุณต้องการกรองออกส่วนประกอบที่ต่ำกว่าขีดจำกัดบางอย่างและสร้างอาร์เรย์ใหม่ คุณสามารถทำได้:
var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }
คำปรึกษา
- การสร้างลำดับใหม่: โปรดจำไว้ว่าการใช้ LINQ ไม่มีจุดประสงค์ให้ใช้ในการปรับเปลี่ยนคอลเลกชันที่มีอยู่ แต่สำหรับการสร้างลำดับใหม่ตามการแปลงหรือการกรอง
การใช้เมธอด ForEach
สำหรับอาร์เรย์ C# ยังมีเมธอด ForEach
ที่ช่วยให้คุณใช้ฟังก์ชันลัมบ์ดเพื่อทำงานง่ายขึ้น:
intArray.ForEach(i => DoSomething(i));
ข้อพิจารณา
- เมื่อไรที่จะใช้
ForEach
: วิธีนี้ทำงานได้ดีสำหรับการดำเนินการชุดของโค้ดสำหรับแต่ละองค์ประกอบ แต่ไม่อาจมีความยืดหยุ่นเท่ากับforeach
หรือfor
สำหรับการดำเนินการที่ซับซ้อนกว่า
สรุป
โดยสรุป ขณะที่ลูป foreach
อาจดูน่าสนใจสำหรับการวนซ้ำอาร์เรย์ใน C# การใช้ลูป for
แบบดั้งเดิมนั้นมีประโยชน์มากกว่าเมื่อคุณต้องการเปลี่ยนแปลงองค์ประกอบโดยตรง สำรวจ LINQ สำหรับการสร้างลำดับใหม่ตามเงื่อนไข และพิจารณาการใช้เมธอด ForEach
สำหรับการดำเนินการที่เป็นระเบียบบนคอลเลกชัน ทางเลือกเหล่านี้จะช่วยให้คุณเขียนโค้ด C# ที่สะอาด อ่านง่าย และมีประสิทธิผลมากขึ้น
โดยการเข้าใจความสามารถและข้อจำกัดของแต่ละโครงสร้าง คุณจะสามารถเลือกเครื่องมือที่เหมาะสมสำหรับงานเขียนโปรแกรมของคุณในอนาคตได้ดีขึ้น.