เนื่องจากวัตถุจำนวนมากมีความแตกต่างด้านประสิทธิภาพระหว่างสิ่งต่อไปนี้หรือไม่?
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)
เนื่องจากวัตถุจำนวนมากมีความแตกต่างด้านประสิทธิภาพระหว่างสิ่งต่อไปนี้หรือไม่?
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)
คำตอบ:
Contains()
เป็นวิธีการอินสแตนซ์และประสิทธิภาพของมันขึ้นอยู่กับคอลเลกชันเป็นส่วนใหญ่ ตัวอย่างเช่นContains()
บน a List
คือ O (n) ในขณะที่Contains()
บนHashSet
คือ O (1)
Any()
เป็นวิธีการขยายและจะดำเนินการรวบรวมโดยใช้ผู้รับมอบสิทธิ์กับทุกออบเจ็กต์ ดังนั้นจึงมีความซับซ้อนของ O (n)
Any()
มีความยืดหยุ่นมากขึ้นอย่างไรก็ตามเนื่องจากคุณสามารถส่งตัวแทนได้ Contains()
ยอมรับได้เฉพาะวัตถุ
Contains
ยังเป็นวิธีการต่อขยายIEnumerable<T>
(แม้ว่าบางคอลเลกชันจะมีContains
วิธีการอินสแตนซ์ของตัวเองด้วย) อย่างที่คุณพูดAny
มีความยืดหยุ่นมากกว่าContains
เพราะคุณสามารถส่งผ่านเพรดิเคตที่กำหนดเองได้ แต่Contains
อาจเร็วกว่าเล็กน้อยเนื่องจากไม่จำเป็นต้องดำเนินการร้องขอตัวแทนสำหรับแต่ละองค์ประกอบ
All()
ดำเนินการในทำนองเดียวกัน
มันขึ้นอยู่กับคอลเลกชัน หากคุณมีคอลเลกชันที่สั่งซื้อContains
อาจทำการค้นหาแบบสมาร์ท (ไบนารีแฮช b-tree ฯลฯ ) ในขณะที่ `` Any () คุณติดอยู่กับการแจงนับจนกว่าจะพบ (สมมติว่า LINQ-to-Objects) .
โปรดทราบว่าในตัวอย่างของคุณAny()
กำลังใช้ตัว==
ดำเนินการซึ่งจะตรวจสอบความเท่าเทียมกันของการอ้างอิงในขณะที่Contains
จะใช้IEquatable<T>
หรือEquals()
วิธีการซึ่งอาจถูกแทนที่
ฉันคิดว่ามันจะขึ้นอยู่กับประเภทของmyCollection
สิ่งที่กำหนดวิธีContains()
การใช้งาน หากต้นไม้ไบนารีที่เรียงลำดับเป็นต้นก็สามารถค้นหาได้อย่างชาญฉลาด นอกจากนี้ยังอาจคำนึงถึงแฮชขององค์ประกอบด้วย Any()
ในทางกลับกันจะแจกแจงผ่านคอลเลกชันจนกว่าจะพบองค์ประกอบแรกที่ตรงตามเงื่อนไข ไม่มีการปรับให้เหมาะสมหากวัตถุมีวิธีการค้นหาที่ชาญฉลาดกว่า
ประกอบด้วย () เป็นวิธีการขยายที่สามารถทำงานได้อย่างรวดเร็วหากคุณใช้อย่างถูกต้อง สำหรับเช่น:
var result = context.Projects.Where(x => lstBizIds.Contains(x.businessId)).Select(x => x.projectId).ToList();
สิ่งนี้จะให้แบบสอบถาม
SELECT Id
FROM Projects
INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item
ในขณะที่ Any () ในทางกลับกันจะวนซ้ำผ่าน O (n) เสมอ
หวังว่าจะได้ผล ....