2012-06-11 30 views
6

Nếu tôi có một chức năng thu thập một loại nhất định, tôi nên sử dụng loại tham số nào?
Trước đây tôi đã giả định IEnumerable là mặc định, nhưng tôi muốn biết điều này có đúng không và nếu có thì tại sao.
ICollection cũng có vẻ giống như một ứng cử viên hợp lệ (do tên của nó), nhưng tôi nhận được ấn tượng IEnumerables thân thiện với người dùng hơn.
Tôi đã tìm ra các ví dụ mà khung công tác mang lại cho chúng tôi sẽ là một ý tưởng hay, nhưng tôi thấy rằng một cái gì đó giống như String.Join, yêu cầu một chuỗi các chuỗi.Thông số chức năng: IEnumerable, ICollection hoặc array?

+1

này đã được trả lời trước đây: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return nhất Trân trọng. – Oscar

+3

['String.Join'] (http://msdn.microsoft.com/en-us/library/dd992421.aspx) có quá tải được thêm vào trong khung thời gian .NET 4 để nó có một' IEnumerable'. Quá tải lấy các ngày mảng từ ngày trước ngày chung chung ... –

+7

@ Oscar: đó là về kiểu trả về — tôi đang nói tham số. –

Trả lời

10

Bạn lấy một sản phẩm ít áp dụng nhất cho khách hàng nhưng cho phép bạn hoàn thành công việc của mình. Nếu bạn có thể lấy đi với IEnumerable<T> trên ICollection<T>, thì bạn nên sử dụng nó vì điều này mang đến sự linh hoạt hơn cho khách hàng của API của bạn.

3

IEnumerable được ưu tiên hơn ICollections. Here là câu trả lời hào phóng cho câu hỏi của bạn.

1

Giao diện chủ yếu được sử dụng làm thông số hoặc trả về các loại trong các hàm để hỗ trợ SOLID Nguyên tắc thiết kế (Nguyên tắc phân đoạn giao diện) để đúc dễ dàng hơn, hỗ trợ chuyển nhiều loại bê tông đến tham số giao tiếp và ẩn (đóng gói) loại tham số từ khách hàng của các chức năng công cộng của bạn.

  • Về IEnumerable:

Rất cơ bản, nó cho thấy nhiều điều tra viên, trong đó hỗ trợ một lần lặp đơn giản qua một bộ sưu tập không chung chung.

[ComVisibleAttribute(true)]  
public interface IEnumerable 
  • Dưới đây là về ICollection:
  • giao diện

Các ICollection mở rộng IEnumerable; IDictionary và IList là các giao diện chuyên biệt hơn để mở rộng ICollection. Việc thực hiện IDictionary là tập hợp các cặp khóa/giá trị, như lớp Hashtable. Việc thực hiện IList là một tập hợp các giá trị và các thành viên của nó có thể được truy cập bằng chỉ mục, giống như lớp ArrayList. Một số bộ sưu tập giới hạn quyền truy cập vào các phần tử của chúng, chẳng hạn như lớp Queue và lớp Stack, trực tiếp triển khai giao diện ICollection. Nếu cả giao diện IDictionary lẫn giao diện IList đều không đáp ứng các yêu cầu của bộ sưu tập bắt buộc, lấy được lớp sưu tập mới từ giao diện ICollection thay vì linh hoạt hơn.

[ComVisibleAttribute(true)] 
public interface ICollection : IEnumerable 
  • Dưới đây là về IList giao diện:

    [ComVisibleAttribute (true)] public interface IList: ICollection, IEnumerable

Thêm từ MSDN về IList: IList là một hậu duệ của giao diện ICollection và là giao diện cơ bản của tất cả các li không chung sts. Việc triển khai IList rơi vào ba danh mục: chỉ đọc, kích thước cố định và biến số. Không thể sửa đổi IList chỉ đọc.Một IList kích thước cố định không cho phép bổ sung hoặc loại bỏ các phần tử, nhưng nó cho phép sửa đổi các phần tử hiện có. Một IList kích thước biến cho phép bổ sung, loại bỏ và sửa đổi các phần tử.

Mẹo:

Trong trường hợp bạn chỉ muốn hỗ trợ foreach cho tham số bộ sưu tập của bạn, IEnumerable nên là đủ. Trong trường hợp bạn cũng muốn hỗ trợ để thêm và xóa các mục khỏi bộ sưu tập, IList là lựa chọn tốt hơn.

Gợi ý: bài viết trên blog này: IEnumerable, ICollection, IList Compared chắc chắn sẽ giúp bạn chụp tốt hơn và quyết định chính xác.

Ngoài ra, hãy xem this article để biết hiệu suất và các so sánh khác về IList và IEnumerable.

+2

-1: Tôi không thể không đồng ý nhiều hơn nữa. ** Luôn luôn ** (cho một giá trị nhất định luôn luôn) sử dụng trừu tượng tối thiểu để hoàn thành công việc, theo cách mã khách hàng của bạn (mã bạn đang viết) không bị ràng buộc khi sử dụng cùng một vùng chứa, bạn có chức năng trở nên chung chung hơn và có tiềm năng lớn hơn để tái sử dụng. –

+0

Vâng @BinaryWorrier Tôi cập nhật câu trả lời để sử dụng IList là lựa chọn duy nhất khi hỗ trợ thêm hoặc xóa các mục là bắt buộc và sử dụng IEnumerable nếu chỉ hỗ trợ foreach là bắt buộc .. Tôi hy vọng bạn đã hiểu câu trả lời tốt hơn ngay bây giờ .. – VS1

+0

Xin lỗi nhưng tôi vẫn không đồng ý. 'IEnumerable ' nên được ưa thích vì nó là trừu tượng tối thiểu. ví dụ. Cho phép tưởng tượng bạn có một hàm lấy danh sách các số và lấy min, max và average. Nếu hàm này có một ICollection, nó có thể được sử dụng bởi bất kỳ lớp nào thực hiện bộ sưu tập của tôi. Nếu nó được viết để sử dụng IEnumerable, nó có thể hoạt động trên _anything_, vì bạn dễ dàng viết bộ điều hợp cho DataReaders hoặc trình đọc tệp mà các mục 'return return' mà không gây thêm dung lượng hoặc xử lý trên đầu và vẫn sử dụng cùng chức năng. –

Các vấn đề liên quan