Bây giờ, hãy tìm nó một cách ngẫu nhiên, Thêm (T) được xác định trong ICollection<T>
, thay vì IEnumerable<T>
. Và các phương thức mở rộng trong Enumerable.cs không chứa Add (T), mà tôi nghĩ là rất kỳ lạ. Vì một đối tượng được liệt kê, nó phải "trông giống như" một tập hợp các mục. bất cứ ai đó có thể trả lời tôi tại sao?Tại sao IEnumerable <T> không triển khai Add (T)?
Trả lời
An IEnumerable<T>
chỉ là một chuỗi các phần tử; xem nó như một con trỏ chỉ về phía trước. Bởi vì rất nhiều các chuỗi đó tạo ra các giá trị, các luồng dữ liệu hoặc các bộ bản ghi từ một cơ sở dữ liệu, nó không có ý nghĩa với các mục Add
đối với chúng.
+1 để sử dụng từ * chuỗi *, vì IEnumerable chính xác là như vậy, và không phải là một loại bộ sưu tập nào đó. – OregonGhost
Các downvoters có thể giải thích lý do tại sao họ downvoted? – Steven
IEnumerable
dùng để đọc, không phải để viết.
Như tên gọi của nó, bạn có thể liệt kê (vòng lặp) trên một IEnumerable, và đó là về nó. Khi bạn muốn có thể Thêm một cái gì đó vào nó, nó sẽ không chỉ là một enumerable nữa, vì nó có tính năng bổ sung.
Ví dụ, một mảng là một IEnumerable, nhưng một mảng có độ dài cố định, vì vậy bạn không thể thêm các mục mới vào nó.
IEnumerable chỉ là 'cơ sở' cho tất cả các loại bộ sưu tập (ngay cả các bộ sưu tập chỉ đọc - rõ ràng là không có phương thức Add()). Bạn sẽ thêm nhiều chức năng hơn vào giao diện cơ bản như vậy, nó càng cụ thể hơn.
Đếm là chính xác - thứ mà bạn có thể liệt kê và khám phá tất cả các mục. Nó không ngụ ý rằng bạn có thể thêm vào nó.
Có khả năng liệt kê là phổ quát đối với nhiều loại đối tượng. Ví dụ, nó được chia sẻ bởi mảng và bộ sưu tập. Nhưng bạn không thể 'thêm' vào một mảng mà không làm rối tung với cấu trúc của nó - trong khi Bộ sưu tập được xây dựng đặc biệt để thêm vào và bị loại bỏ.
Về mặt kỹ thuật, bạn có thể 'thêm' vào một số, tuy nhiên - bằng cách sử dụng Concat<>
- tuy nhiên tất cả điều này là tạo ra một điều tra liệt kê từ một đếm sang kế tiếp - cho ảo giác của một tập hợp duy nhất.
+1 để đề xuất phương án thay thế, Concat. – Emile
Tên nói lên tất cả. IEnumerable chỉ để liệt kê các mục. ICollection là bộ sưu tập thực sự của các mục và do đó hỗ trợ phương thức Add.
Mỗi ICollection
phải là IEnumerable
(Tôi nghĩ, và nhóm .NET Framework có vẻ đồng ý với tôi ;-)), nhưng cách khác xung quanh không phải lúc nào cũng hợp lý. Có một hệ thống phân cấp của "bộ sưu tập như các đối tượng" trong thế giới này, và giả định của bạn rằng một enumerable sẽ là một bộ sưu tập bạn có thể thêm các mục để không giữ đúng trong hệ thống phân cấp đó.
Ví dụ: danh sách tên màu chính sẽ là IEnumerable
trả lại "Red"
, "Blue"
và "Green"
. Nó sẽ làm cho không có ý nghĩa logic ở tất cả để có thể làm một primaryColors.Add("Bright Purple")
trên một "bộ sưu tập" điền như thế này:
...whatever...
{
...
var primaryColors = EnumeratePrimaryColors();
...
}
private static IEnumerable<string> EnumeratePrimaryColors() {
yield return "Red";
yield return "Blue";
yield return "Green";
}
- 1. Tại sao C# mảng đa chiều không triển khai IEnumerable <T>?
- 2. Tại sao Danh sách <T> triển khai IList <T>, ICollection <T> và IEnumerable <T>?
- 3. Tại sao IEnumerable <T> kế thừa từ IEnumerable?
- 4. Triển khai IEquatable <T> khi T có thể là IEnumerable <T>
- 5. Cách triển khai IEnumerable <T> bằng GetEnumerator()?
- 6. Tại sao HashSet <T> không triển khai IReadOnlyCollection <T>?
- 7. Tại sao IList <T> không có phương thức Chèn lấy IEnumerable <T>?
- 8. Tại sao có quá nhiều bộ sưu tập có tên trong .NET không triển khai IEnumerable <T>?
- 9. Sự khác nhau giữa IEnumerable và IEnumerable <T>?
- 10. IEnumerable <IEnumerable <T>> để IEnumerable <T> sử dụng LINQ
- 11. Cast IEnumerable để IEnumerable <T> khi T không biết tại thời gian biên dịch
- 12. Việc triển khai thực hiện các tính năng IEnumerable <T>
- 13. Tại sao F # Set không triển khai ISet <T>?
- 14. Tại sao TreeNodeCollection không ngụ ý IEnumerable <TreeNode>?
- 15. Tại sao IEnumerable <struct> không thể xem như IEnumerable <object>?
- 16. Tại sao tôi không thể đưa danh sách <T> của IEnumerable vào BindingList <t>?
- 17. Tại sao IEnumerable <T> .Max buộc T là IComparable?
- 18. Làm thế nào để chuyển đổi một IEnumerable <IEnumerable <T>> thành IEnumerable <T>
- 19. Tại sao sử dụng .AsEnumerable() thay vì truyền tới IEnumerable <T>?
- 20. Tại sao Danh sách <T> .ForEach() triển khai vòng lặp for?
- 21. Tại sao HttpSessionState không triển khai IDictionary?
- 22. EditorFor IEnumerable <T> với TEMPLATENAME
- 23. Tại sao Enumerable.Range triển khai IDisposable?
- 24. Danh sách <T> không triển khai SyncRoot!
- 25. IEnumerable <T> VS IList <T> VS IQueryable <T>
- 26. Cách xoay vòng IEnumerable <T>
- 27. Generics Java - tại sao "mở rộng T" được phép nhưng không "triển khai T"?
- 28. Tại sao tôi không thể sử dụng LINQ to Objects khi lớp của tôi triển khai IEnumerable <T> nhiều lần?
- 29. IEnumerable.GetEnumerator() và IEnumerable <T> .GetEnumerator()
- 30. Tại sao biểu thức khởi tạo bộ sưu tập yêu cầu IEnumerable được triển khai?
Đã 'IEnumerable' cần thiết 'Add' được thực hiện, sẽ có nhiều hơn nữa các câu hỏi cách khác xung quanh: * Tại sao 'IEnumerable 'có' Add' *. Theo cách của nó, rất hữu ích :) –
nawfal