วิธีที่เร็วที่สุดในการค้นหารายการที่พบร่วมกันในหลายรายการใน C#

เมื่อทำงานกับคอลเลกชันใน C# คุณอาจพบสถานการณ์ที่คุณจำเป็นต้องค้นหารายการที่เหมือนกันในหลายรายการ สิ่งนี้มีประโยชน์โดยเฉพาะเมื่อคุณต้องการกรองผลลัพธ์ตามเกณฑ์ที่เฉพาะเจาะจง ในบล็อกโพสต์นี้ เราจะพูดถึงสถานการณ์ทั่วไป: วิธีการระบุวัตถุ Option ที่ปรากฏอยู่ในทุกรายการในรายการของรายการอย่างรวดเร็ว

ข้อกำหนดปัญหา

จินตนาการว่าคุณมีรายการของรายการ โดยเฉพาะอย่างยิ่งโครงสร้างเช่น List<List<Option>> optionLists คุณจำเป็นต้องพิจารณาว่าวัตถุ Option ใดที่มีอยู่ในทุก N รายการ เพื่อแก้ปัญหานี้ เราต้องตระหนักว่าความเท่ากันของวัตถุ Option ถูกกำหนดโดยคุณสมบัติของสตริงที่เฉพาะเจาะจง เช่น option1.Value == option2.Value ในที่สุด เราต้องการคืนค่า List<Option> ที่แต่ละรายการปรากฏเพียงครั้งเดียว

โซลูชัน: การค้นหารายการที่เหมือนกัน

เพื่อจัดการกับปัญหานี้ เราสามารถใช้ LINQ (Language Integrated Query) ใน C# LINQ ให้วิธีที่มีประสิทธิภาพในการสอบถามคอลเลกชัน ซึ่งทำให้เหมาะสมกับกรณีการใช้งานของเรา ด้านล่างเป็นโค้ดสั้นที่มีประสิทธิภาพที่ทำให้เกิดงานนี้:

var x = from list in optionLists
        from option in list
        where optionLists.All(l => l.Any(o => o.Value == option.Value))
        orderby option.Value
        select option;

คำอธิบายของโค้ด

มาทำลายการสอบถาม LINQ ทีละขั้นตอน:

  1. Outer From Clause: ส่วนแรก from list in optionLists ทำการวนลูปผ่านแต่ละรายการในรายการหลักของเรา (optionLists)

  2. Inner From Clause: ส่วนที่สอง from option in list เข้าถึงวัตถุ Option แต่ละรายการภายในรายการปัจจุบัน

  3. Where Clause: นี่คือส่วนที่สำคัญที่สุดของโซลูชัน:

    • เงื่อนไข where optionLists.All(l => l.Any(o => o.Value == option.Value)) ตรวจสอบว่าตัวเลือกปัจจุบันถูกพบใน ทุก รายการใน optionLists
    • วิธี Any ตรวจสอบว่ามีวัตถุ Option o ใด ๆ ในรายการปัจจุบัน l ที่ค่า Value ตรงกับ Value ของตัวเลือกปัจจุบัน
  4. Ordering the Results: ส่วน orderby option.Value จัดเรียงวัตถุ Option ที่ได้ตาม Value ของพวกมัน

  5. Select Clause: สุดท้าย select option รวบรวมทุกตัวเลือกที่มีสิทธิ์ไว้ในคอลเลกชัน

ข้อพิจารณาสำคัญ

  • Distinct Values: โค้ดที่ให้มาไม่ได้รวมการเลือกที่แตกต่าง ซึ่งหมายความว่ามันสามารถคืนค่าวัตถุ Option หลายรายการที่มี Value เดียวกัน หากคุณต้องการวัตถุ Options ที่ไม่ซ้ำกัน ให้พิจารณาแนบ .Distinct() ไปยังการสอบถามของคุณ

  • Performance: ขึ้นอยู่กับขนาดของรายการของคุณ ประสิทธิภาพของวิธีนี้มีความสำคัญ คำสั่ง LINQ ได้รับการปรับให้เหมาะสมและสามารถทำงานได้ดีด้วยชุดข้อมูลขนาดปานกลาง

สรุป

การค้นหารายการที่พบร่วมกันในหลายรายการสามารถทำได้อย่างมีประสิทธิภาพใน C# โดยใช้ LINQ ตามที่ได้อธิบายในตัวอย่างของเรา โดยการใช้พลังของ LINQ เราสามารถดำเนินการสอบถามที่ซับซ้อนได้โดยใช้ความพยายามในการเขียนโค้ดที่น้อยลง สิ่งนี้ไม่เพียงแต่ทำให้กระบวนการเขียนโค้ดของคุณเร็วขึ้น แต่ยังช่วยเพิ่มความสามารถในการอ่านและรักษาโค้ดของคุณ

ตอนนี้คุณได้เตรียมพร้อมกับความรู้นี้แล้ว คุณสามารถนำไปใช้ในการแก้ปัญหาในโครงการของคุณได้อย่างง่ายดาย ทำให้การจัดการกับคอลเลกชันของคุณง่ายขึ้นและมีประสิทธิภาพมากขึ้น