ฉันสงสัยว่า Enumerators ทำงานอย่างไรและ LINQ พิจารณาตัวเลือกสองอย่างง่าย ๆ เหล่านี้:
List<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct().ToList();
หรือ
IEnumerable<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct();
ฉันเปลี่ยนชื่อของวัตถุดั้งเดิมของฉันเพื่อให้ดูเหมือนเป็นตัวอย่างทั่วไปมากขึ้น แบบสอบถามเองไม่สำคัญ สิ่งที่ฉันต้องการถามคือ:
foreach (Animal animal in sel) { /*do stuff*/ }
ฉันสังเกตเห็นว่าถ้าฉันใช้
IEnumerable
เมื่อฉันตรวจแก้จุดบกพร่องและตรวจสอบ "sel" ซึ่งในกรณีนี้คือ IEnumerable มันมีสมาชิกที่น่าสนใจ: "Inner", "outer", "outerKeySelector" และ "outerKeySelector" 2 ตัวสุดท้ายนี้ปรากฏ ที่จะได้รับมอบหมาย สมาชิก "ภายใน" ไม่มีอินสแตนซ์ "สัตว์" ในนั้น แต่เป็นอินสแตนซ์ "สปีชีส์" ซึ่งแปลกสำหรับฉันมาก สมาชิก "outer" ประกอบด้วยอินสแตนซ์ "Animal" ฉันคิดว่าผู้ได้รับมอบหมายทั้งสองเป็นผู้กำหนดว่าจะเข้าไปทางไหนและเกิดอะไรขึ้นบ้างฉันสังเกตเห็นว่าถ้าฉันใช้ "Distinct" "inner" มี 6 รายการ (ไม่ถูกต้องเนื่องจากมี 2 Distinct เท่านั้น) แต่ "outer" มีค่าที่ถูกต้อง อีกครั้งอาจเป็นวิธีการมอบหมายกำหนดนี้ แต่นี่เป็นบิตมากกว่าที่ฉันรู้เกี่ยวกับ IEnumerable
สำคัญที่สุดข้อใดของสองตัวเลือกคือประสิทธิภาพที่ดีที่สุด?
รายการแปลงความชั่วร้ายผ่านทาง.ToList()
?
หรืออาจจะใช้ตัวแจงนับโดยตรง
หากทำได้โปรดอธิบายหรืออธิบายลิงก์บางอันที่อธิบายการใช้ IEnumerable นี้