ใครช่วยอธิบายได้ว่าฟังก์ชัน LINQ ที่ (.. ) และ FindAll (.. ) แตกต่างกันอย่างไร ดูเหมือนทั้งคู่จะทำสิ่งเดียวกัน ...
ใครช่วยอธิบายได้ว่าฟังก์ชัน LINQ ที่ (.. ) และ FindAll (.. ) แตกต่างกันอย่างไร ดูเหมือนทั้งคู่จะทำสิ่งเดียวกัน ...
คำตอบ:
FindAll()
เป็นฟังก์ชันในList<T>
ประเภทไม่ใช่วิธีการขยาย LINQ เช่นWhere
. วิธีการขยาย LINQ ใช้งานได้กับทุกประเภทที่ใช้IEnumerable
ในขณะที่FindAll
สามารถใช้ได้เฉพาะกับList<T>
อินสแตนซ์ (หรืออินสแตนซ์ของคลาสที่สืบทอดมาจากมัน)
นอกจากนี้ยังแตกต่างกันในวัตถุประสงค์ที่แท้จริง Where
ส่งคืนอินสแตนซ์ของIEnumerable
สิ่งที่ดำเนินการตามความต้องการเมื่อวัตถุถูกแจกแจง FindAll
ส่งคืนใหม่List<T>
ที่มีองค์ประกอบที่ร้องขอ FindAll
เป็นเหมือนการโทรในตัวอย่างของWhere(...).ToList()
IEnumerable
ความแตกต่างที่ยิ่งใหญ่ที่สุดสำหรับฉันคือ FindAll มีอยู่ใน. Net 2.0 ด้วย ฉันไม่มีความหรูหราในการเขียนโปรแกรมใน. Net 3.5 เสมอไปดังนั้นฉันจึงพยายามจำวิธีการ 'เนทีฟ' ของคอลเลกชันทั่วไป
เกิดขึ้นหลายครั้งที่ฉันใช้วิธีรายการที่มีอยู่แล้วด้วยตัวเองเพราะฉันไม่สามารถ LINQ ได้
สิ่งที่ฉันพบว่ามีประโยชน์ในกรณีนี้คือเมื่อใช้ VS2008 ฉันสามารถใช้การอนุมานประเภทและไวยากรณ์แลมบ์ดาได้ คุณลักษณะเหล่านี้เป็นคุณลักษณะของคอมไพเลอร์ไม่ใช่คุณลักษณะของกรอบ ซึ่งหมายความว่าฉันสามารถเขียนสิ่งนี้ได้และยังคงอยู่ภายใน. Net 2.0:
var myOddNums = myNums.FindAll(n => n%2==1);
แต่ถ้าคุณมี LINQ การรักษาความแตกต่างระหว่างการดำเนินการรอการตัดบัญชีและการดำเนินการทันทีเป็นสิ่งสำคัญ
ถ้าฉันจำได้อย่างถูกต้องความแตกต่างที่สำคัญ (นอกเหนือจากสิ่งที่นำไปใช้กับ: IEnumerable<T>
เทียบกับList<T>
) คือWhere
การดำเนินการรอการตัดบัญชีโดยที่มันไม่ได้ทำการค้นหาจนกว่าคุณจะต้องการ - โดยใช้มันใน foreach loop เป็นต้น FindAll
เป็นวิธีการดำเนินการทันที
ฉันไม่ได้ทดสอบบางอย่างอยู่ในรายชื่อของวัตถุ 80K และพบว่าFind()
สามารถเป็นได้ถึง 1000% เร็วกว่าการใช้ด้วยWhere
FirstOrDefault()
ฉันไม่รู้จนกระทั่งทดสอบตัวจับเวลาก่อนและหลังการโทรแต่ละครั้ง บางครั้งมันเป็นเวลาเดียวกันเวลาอื่น ๆ มันเร็วกว่า