การเข้าใจ LINQ และเมธอดขยายใน C#
เมื่อทำงานกับคอลเลกชันใน C# การกรองข้อมูลเป็นงานที่เกิดขึ้นทั่วไป นักพัฒนามักพบกับทางเลือกในการตัดสินใจระหว่างการใช้ ไวยากรณ์ LINQ แบบดั้งเดิม หรือ นิพจน์ Lambda แบบทันสมัยที่ผสมผสานกับ เมธอดขยาย บทความบล็อกนี้จะพูดถึงความแตกต่างระหว่างวิธีการทั้งสอง โดยมุ่งเน้นว่าเมื่อใดควรใช้ เมธอดขยายพร้อมกับ lambda แทน LINQ เพื่อวัตถุในการกรองคอลเลกชัน
คอลเลกชันที่กล่าวถึง
ลองพิจารณาตัวอย่างที่เป็นรูปธรรม สมมติว่าเรามีคอลเลกชันของผลิตภัณฑ์ซึ่งแต่ละตัวแทนด้วยคลาส MyProduct
:
public class MyProduct
{
public string Name { get; set; }
public Double Price { get; set; }
public string Description { get; set; }
}
var MyProducts = new List<MyProduct>
{
new MyProduct
{
Name = "Surfboard",
Price = 144.99,
Description = "สิ่งที่สำคัญที่สุดที่คุณจะเป็นเจ้าของ."
},
new MyProduct
{
Name = "Leash",
Price = 29.28,
Description = "เก็บสิ่งสำคัญใกล้ตัวคุณ."
},
new MyProduct
{
Name = "Sun Screen",
Price = 15.88,
Description = "SPF 1000! ใครจะถามหาอีก!"
}
};
การกรองด้วย LINQ
เมื่อใช้ LINQ สำหรับการกรอง ไวยากรณ์จะทั้งเข้าใจง่ายและมีพลัง:
var filteredProductsLINQ = (from mp in MyProducts
where mp.Price < 50d
select mp);
ในส่วนนี้ เราได้สร้างคอลเลกชันผลิตภัณฑ์ที่กรองแล้วซึ่งมีราคาต่ำกว่า $50
การกรองด้วยเมธอดขยายและนิพจน์ Lambda
ในลักษณะเดียวกัน คุณสามารถทำผลลัพธ์เดียวกันได้โดยใช้เมธอดขยายพร้อมกับนิพจน์ lambda:
var filteredProductsLambda = MyProducts.Where(mp => mp.Price < 50d).ToList();
ในกรณีนี้ เราใช้เมธอด Where
โดยตรงกับคอลเลกชัน MyProducts
โดยส่งนิพจน์ lambda ที่กำหนดเกณฑ์การกรองของเรา
ความแตกต่างที่สำคัญอธิบาย
แม้ว่าวิธีการทั้งสองจะกรองคอลเลกชันได้อย่างมีประสิทธิภาพ แต่มีความแตกต่างเล็กน้อยที่ต้องพิจารณา:
1. ประเภทของผลลัพธ์
-
ไวยากรณ์คำสั่ง LINQ (ตัวอย่างแรก) คืนค่าเป็น
IEnumerable<MyProduct>
ซึ่งเป็นแหล่งข้อมูลที่สามารถทำซ้ำได้ หากไม่มีการเรียกที่ตามมาเช่น.ToList()
จะไม่มีการดำเนินการทันที. -
วิธีที่สองโดยใช้การขยาย
Where
จะดำเนินการเมื่อมีการเรียก.ToList()
ทำให้สร้างรายการของผลิตภัณฑ์ที่กรองแล้ว.
2. การอ่านและความตั้งใจ
-
ไวยากรณ์ LINQ อาจดูชัดเจนและประกาศได้ง่ายกว่าสำหรับผู้ที่คุ้นเคยกับไวยากรณ์แบบ SQL.
-
นิพจน์ Lambda และเมธอดขยายให้วิธีที่กระชับในการแสดงถึงความตั้งใจในการกรองในบรรทัดเดียว ซึ่งนักพัฒนาบางคนอาจพบว่ามีความอ่านง่ายมากกว่า.
3. ประสิทธิภาพ
- แม้ว่าวิธีทั้งสองจะให้ลักษณะการทำงานที่ใกล้เคียงกันสำหรับภารกิจการกรอง แต่ต้องจำไว้ว่าคำสั่ง LINQ บางครั้งอาจมีการดำเนินการที่เลื่อนเวลา ซึ่งจะมีประโยชน์หากแหล่งข้อมูลพื้นฐานมีขนาดใหญ่และคุณต้องการลดการดำเนินการที่ไม่จำเป็นจนกว่าจะจำเป็นต้องใช้ผลลัพธ์ที่กรองแล้ว.
สรุป: ควรใช้วิธีใด?
ท้ายที่สุดแล้ว การตัดสินใจขึ้นอยู่กับความชอบส่วนตัวหรือความชอบของทีมเว้นแต่จะมีความต้องการเฉพาะสำหรับการอ่านหรือสไตล์ของโค้ด ในขณะที่ไม่มี ความแตกต่างที่ชัดเจน ในผลลัพธ์ของการกรองโดยใช้ LINQ กับเมธอดขยายที่ใช้ lambda แต่การเข้าใจว่าเมื่อใดควรใช้วิธีใดจะช่วยปรับปรุงความชัดเจนในโค้ดของคุณได้.
- ใช้ ไวยากรณ์ LINQ หากคุณต้องการความชัดเจนในรูปแบบที่เหมือน SQL.
- ใช้ เมธอดขยายพร้อม lambda สำหรับวิธีการที่กระชับและอาจอ่านง่ายกว่า.
การเข้าใจวิธีปฏิบัติของทีมของคุณและบริบทที่คุณกำลังเขียนโค้ดจะช่วยนำทางคุณไปสู่ทางเลือกที่ดีที่สุด.
ด้วยการพิจารณาแง่มุมเหล่านี้ คุณสามารถตัดสินใจอย่างมีข้อมูลเกี่ยวกับวิธีการกรองคอลเลกชันอย่างมีประสิทธิภาพในโปรเจ็กต์ C# ของคุณ.