วิธีที่เร็วที่สุดในการค้นหารายการที่พบร่วมกันในหลายรายการใน 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 ทีละขั้นตอน:
-
Outer From Clause: ส่วนแรก
from list in optionLists
ทำการวนลูปผ่านแต่ละรายการในรายการหลักของเรา (optionLists
) -
Inner From Clause: ส่วนที่สอง
from option in list
เข้าถึงวัตถุOption
แต่ละรายการภายในรายการปัจจุบัน -
Where Clause: นี่คือส่วนที่สำคัญที่สุดของโซลูชัน:
- เงื่อนไข
where optionLists.All(l => l.Any(o => o.Value == option.Value))
ตรวจสอบว่าตัวเลือกปัจจุบันถูกพบใน ทุก รายการในoptionLists
- วิธี
Any
ตรวจสอบว่ามีวัตถุOption o
ใด ๆ ในรายการปัจจุบันl
ที่ค่าValue
ตรงกับValue
ของตัวเลือกปัจจุบัน
- เงื่อนไข
-
Ordering the Results: ส่วน
orderby option.Value
จัดเรียงวัตถุOption
ที่ได้ตามValue
ของพวกมัน -
Select Clause: สุดท้าย
select option
รวบรวมทุกตัวเลือกที่มีสิทธิ์ไว้ในคอลเลกชัน
ข้อพิจารณาสำคัญ
-
Distinct Values: โค้ดที่ให้มาไม่ได้รวมการเลือกที่แตกต่าง ซึ่งหมายความว่ามันสามารถคืนค่าวัตถุ
Option
หลายรายการที่มีValue
เดียวกัน หากคุณต้องการวัตถุOptions
ที่ไม่ซ้ำกัน ให้พิจารณาแนบ.Distinct()
ไปยังการสอบถามของคุณ -
Performance: ขึ้นอยู่กับขนาดของรายการของคุณ ประสิทธิภาพของวิธีนี้มีความสำคัญ คำสั่ง LINQ ได้รับการปรับให้เหมาะสมและสามารถทำงานได้ดีด้วยชุดข้อมูลขนาดปานกลาง
สรุป
การค้นหารายการที่พบร่วมกันในหลายรายการสามารถทำได้อย่างมีประสิทธิภาพใน C# โดยใช้ LINQ ตามที่ได้อธิบายในตัวอย่างของเรา โดยการใช้พลังของ LINQ เราสามารถดำเนินการสอบถามที่ซับซ้อนได้โดยใช้ความพยายามในการเขียนโค้ดที่น้อยลง สิ่งนี้ไม่เพียงแต่ทำให้กระบวนการเขียนโค้ดของคุณเร็วขึ้น แต่ยังช่วยเพิ่มความสามารถในการอ่านและรักษาโค้ดของคุณ
ตอนนี้คุณได้เตรียมพร้อมกับความรู้นี้แล้ว คุณสามารถนำไปใช้ในการแก้ปัญหาในโครงการของคุณได้อย่างง่ายดาย ทำให้การจัดการกับคอลเลกชันของคุณง่ายขึ้นและมีประสิทธิภาพมากขึ้น