การแทนที่การวนซ้ำอาร์เรย์ 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# ที่สะอาด อ่านง่าย และมีประสิทธิผลมากขึ้น

โดยการเข้าใจความสามารถและข้อจำกัดของแต่ละโครงสร้าง คุณจะสามารถเลือกเครื่องมือที่เหมาะสมสำหรับงานเขียนโปรแกรมของคุณในอนาคตได้ดีขึ้น.