IList vs IEnumerable cho Bộ sưu tập về các thực thể


146

Khi tôi có các thực thể trong miền của mình với danh sách các thứ, chúng có nên được hiển thị dưới dạng ILists hoặc IEnumerables không? Ví dụ, Order có một loạt OrderLines.


Nó sẽ là khôn ngoan để thực hiện cả hai?
PedroC88

4
Nó sẽ không. Một IList thừa hưởng từ IEnumerable.
Unknown1987

Câu trả lời:


183

IEnumerable<T>đại diện cho một loạt các mục mà bạn có thể lặp đi lặp lại (ví dụ sử dụng foreach), trong khi đó IList<T>là một bộ sưu tập mà bạn có thể thêm hoặc xóa khỏi.

Thông thường, bạn sẽ muốn có thể sửa đổi Đơn hàng bằng cách thêm hoặc xóa Đơn hàng cho đơn hàng, vì vậy bạn có thể muốn Order.Lines là một IList<OrderLine>.

Đã nói rằng, có một số quyết định thiết kế khung bạn nên đưa ra. Ví dụ, có thể thêm cùng một thể hiện của OrderLine vào hai đơn hàng khác nhau không? Chắc là không. Vì vậy, nếu bạn muốn có thể xác thực xem có nên thêm OrderLine vào đơn hàng hay không, bạn thực sự có thể muốn hiển thị thuộc tính Lines chỉ là một IEnumerable<OrderLine>và cung cấp các phương thức Add (OrderLine) và Remove (OrderLine) có thể xử lý xác nhận đó.


5
Bạn cũng có thể sử dụng một IReadOnlyListhoặc IReadOnlyCollectionnếu bạn cần danh sách cụ thể hóa nhưng bạn không muốn thêm hoặc xóa khỏi danh sách.
julealgon

Sau đó IReadOnlyListkhông có ý nghĩa.
ajeh

24

Hầu hết thời gian tôi kết thúc với IList trên IEnumerable vì IEnumerable không có phương thức Count và bạn không thể truy cập bộ sưu tập thông qua một chỉ mục (mặc dù nếu bạn đang sử dụng LINQ, bạn có thể giải quyết vấn đề này bằng các phương thức mở rộng).


1
Tôi tin rằng bạn luôn có thể khởi tạo việc triển khai IList bằng IEnumerable nếu bạn cần truy cập phương thức đếm và ví dụ tương tự: IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (liệt kê ); Tuy nhiên, cách bạn trưng bày bộ sưu tập của mình nên tùy thuộc vào các cân nhắc, chẳng hạn như bạn có muốn thuộc tính bộ sưu tập là bất biến hay không (IEnumerable sẽ không cho phép bạn sửa đổi bộ sưu tập) hay không (đọc IList)
Sudhanshu Mishra

11
IEnumerable <T> .Count () kiểm tra xem loại bên dưới có phải là ICollection <T> thực hiện thuộc tính Count không.
andleer

"Bạn không thể truy cập bộ sưu tập thông qua một chỉ mục" - còn ElementAtphương pháp thì sao?
ivamax9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.