IList vs IEnumerable สำหรับคอลเลกชันบนเอนทิตี


146

เมื่อฉันมีเอนทิตีในโดเมนของฉันที่มีรายการของสิ่งต่าง ๆ พวกเขาควรถูกเปิดเผยในฐานะ ILists หรือ IEnumerables? เช่นคำสั่งซื้อมีพวงของ OrderLines


จะเป็นการดีที่จะใช้ทั้งสองอย่าง?
PedroC88

4
มันจะไม่ IList สืบทอดมาจาก IEnumerable
1987

คำตอบ:


183

IEnumerable<T>แสดงชุดของรายการที่คุณสามารถวนซ้ำ (ตัวอย่างเช่นใช้ foreach) ในขณะที่IList<T>เป็นคอลเล็กชันที่คุณสามารถเพิ่มหรือลบออกได้

โดยปกติแล้วคุณจะต้องการที่จะสามารถที่จะปรับเปลี่ยนการสั่งซื้อโดยเพิ่มหรือลบรายการคำสั่งซื้อไปเพื่อให้คุณอาจต้องการ Order.Lines IList<OrderLine>จะเป็น

ต้องบอกว่ามีการตัดสินใจออกแบบกรอบคุณควรทำ ตัวอย่างเช่นควรเป็นไปได้ที่จะเพิ่มอินสแตนซ์เดียวกันของ OrderLine ให้กับคำสั่งซื้อที่ต่างกันสองรายการหรือไม่ อาจจะไม่. ดังนั้นเมื่อคุณต้องการตรวจสอบว่าควรเพิ่ม OrderLine ในการสั่งซื้อหรือไม่คุณอาจต้องการแสดงคุณสมบัติของ Lines เป็นเพียง an IEnumerable<OrderLine>และให้เพิ่ม (OrderLine) และ Remove (OrderLine) ซึ่งสามารถจัดการได้ การตรวจสอบที่


5
คุณยังสามารถใช้IReadOnlyListหรือIReadOnlyCollectionถ้าคุณต้องการรายการที่ปรากฏ แต่คุณไม่ต้องการที่จะเพิ่มหรือลบออกจากมัน
julealgon

จากนั้นก็IReadOnlyListไม่มีเหตุผล
ajeh

24

เวลาส่วนใหญ่ที่ฉันไปกับ IList ผ่าน IEnumerable เนื่องจาก IEnumerable ไม่มีวิธีการนับและคุณไม่สามารถเข้าถึงคอลเลกชันผ่านดัชนี (แม้ว่าคุณจะใช้ LINQ คุณก็สามารถใช้วิธีนี้กับส่วนขยายได้)


1
ฉันเชื่อว่าคุณสามารถยกตัวอย่างการใช้ IList ด้วย IEnumerable หากคุณต้องการเข้าถึงวิธีการนับและสิ่งที่ชอบ: IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (enumerable ); อย่างไรก็ตามวิธีที่คุณเปิดเผยคอลเลกชันของคุณควรขึ้นอยู่กับการพิจารณาเช่นคุณต้องการให้คุณสมบัติของคอลเลกชันนั้นไม่เปลี่ยนรูป (IEnumerable ไม่อนุญาตให้คุณปรับเปลี่ยนคอลเลกชัน) หรือไม่ (อ่าน IList)
Sudhanshu Mishra

11
IEnumerable <T> .Count () ตรวจสอบเพื่อดูว่าประเภทพื้นฐานเป็น ICollection <T> ซึ่งใช้คุณสมบัตินับ
andleer

"คุณไม่สามารถเข้าถึงคอลเลกชันผ่านดัชนี" - ElementAtวิธีการเกี่ยวกับอะไร?
ivamax9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.