IList vs IEnumerable untuk Collections on Entities

146

Ketika saya memiliki entitas di domain saya dengan daftar hal, haruskah mereka diekspos sebagai ILists atau IEnumerables? Misalnya Order memiliki banyak OrderLines.

pondermatik
sumber
Apakah bijaksana untuk mengimplementasikan keduanya?
PedroC88
4
Tidak akan. Seorang IList mewarisi dari IEnumerable.
Unknown1987

Jawaban:

183

IEnumerable<T>mewakili serangkaian item yang dapat Anda ulangi (menggunakan foreach, misalnya), sedangkan IList<T>koleksi yang dapat Anda tambahkan atau hapus dari.

Biasanya Anda ingin dapat memodifikasi Order dengan menambahkan atau menghapus OrderLines, jadi Anda mungkin ingin Order.Lines menjadi IList<OrderLine>.

Karena itu, ada beberapa keputusan desain kerangka kerja yang harus Anda buat. Misalnya, apakah mungkin untuk menambahkan instance OrderLine yang sama ke dua pesanan yang berbeda? Mungkin tidak. Jadi mengingat Anda ingin memvalidasi apakah OrderLine harus ditambahkan ke pesanan, Anda mungkin memang ingin memunculkan properti Lines hanya sebagai IEnumerable<OrderLine>, dan menyediakan metode Tambah (OrderLine) dan Hapus (OrderLine) yang dapat menangani validasi itu.

Matt Hamilton
sumber
5
Anda juga dapat menggunakan IReadOnlyListatau IReadOnlyCollectionjika Anda perlu membuat daftar tetapi Anda tidak ingin menambah atau menghapusnya.
julealgon
Maka IReadOnlyListtidak masuk akal.
ajeh
24

Sebagian besar waktu saya berakhir dengan IList lebih dari IEnumerable karena IEnumerable tidak memiliki metode Count dan Anda tidak dapat mengakses koleksi melalui indeks (walaupun jika Anda menggunakan LINQ Anda dapat menyiasati ini dengan metode ekstensi).

JoshSchlesinger
sumber
1
Saya percaya Anda dapat selalu instantiate implementasi IList dengan IEnumerable jika Anda perlu mengakses metode penghitungan dan sejenisnya misalnya: IEnumerable <string> enumerable = <some-IEnumerable> Daftar <string> myList = daftar baru <string> (enumerable ); Namun, bagaimana Anda mengekspos koleksi Anda harus bergantung pada pertimbangan seperti apakah Anda ingin properti koleksi tidak dapat diubah (IEnumerable tidak akan memungkinkan Anda untuk mengubah koleksi) atau tidak (baca IList)
Sudhanshu Mishra
11
IEnumerable <T> .Count () memeriksa untuk melihat apakah tipe yang mendasarinya adalah ICollection <T> yang mengimplementasikan properti Count.
andleer
"Anda tidak dapat mengakses koleksi melalui indeks" - bagaimana dengan ElementAtmetode?
ivamax9