การเข้าใจ 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# ของคุณ.