Tôi đang ở trong tình huống mà tôi chỉ muốn chắp thêm các giá trị vào mảng chuỗi (nhập String []) vào một đối tượng có IList < Chuỗi >. Một cách nhanh chóng tìm kiếm trên MSDN tiết lộ rằng IList <T> 's Chèn phương pháp chỉ có một phiên bản mà mất một chỉ mục và một đối tượng T, và không có một phiên bản mà mất IEnumerable <T> thay vì T. Điều này có nghĩa rằng Tôi phải viết một vòng lặp trên một danh sách đầu vào để đưa các giá trị vào danh sách đích? Nếu đúng như vậy, có vẻ như thiết kế API rất hạn chế và khá thân thiện với tôi. Có lẽ, tôi đang thiếu một cái gì đó. C# chuyên gia làm gì trong trường hợp này?Tại sao IList <T> không có phương thức Chèn lấy IEnumerable <T>?
23
A
Trả lời
38
Do giao diện thường là chức năng ít nhất cần thiết để làm cho nó có thể sử dụng được, để giảm gánh nặng cho người triển khai. Với C# 3.0, bạn có thể thêm phương thức này làm phương thức mở rộng:
public static void AddRange<T>(this IList<T> list, IEnumerable<T> items) {
if(list == null) throw new ArgumentNullException("list");
if(items == null) throw new ArgumentNullException("items");
foreach(T item in items) list.Add(item);
}
et voila; IList<T>
hiện có AddRange
:
IList<string> list = ...
string[] arr = {"abc","def","ghi","jkl","mno"};
list.AddRange(arr);
Các vấn đề liên quan
- 1. Tại sao IEnumerable <T> kế thừa từ IEnumerable?
- 2. Tại sao IEnumerable <struct> không thể xem như IEnumerable <object>?
- 3. Chuyển đổi IEnumerable <T> sang IList
- 4. Phương pháp mở rộng đơn trên IDictionary <K, IEnumerable/IList/ICollection <V>>
- 5. Tại sao IList <>. Reverse() không hoạt động như Danh sách <>(). Đảo ngược
- 6. IEnumerable <T> VS IList <T> VS IQueryable <T>
- 7. Tại sao Danh sách <T> triển khai IList <T>, ICollection <T> và IEnumerable <T>?
- 8. Tại sao IList <> có ít tính năng hơn Danh sách <>?
- 9. Tại sao TreeNodeCollection không ngụ ý IEnumerable <TreeNode>?
- 10. Tại sao không Cast <double>() hoạt động trên IEnumerable <int>?
- 11. IList <Type> để IList <BaseType>
- 12. Flatten IEnumerable <IEnumerable <>>; hiểu Generics
- 13. Tại sao không có Sắp xếp cho IList <T>?!?! (đã chỉnh sửa)
- 14. Tại sao một chức năng mất IEnumerable <interface> không chấp nhận IEnumerable <class>?
- 15. IList <T> .FindIndex (Int32, Predicate <T>)
- 16. Tại sao việc triển khai 'IList <T>' yêu cầu xác định hai phương thức 'GetEnumerator'?
- 17. Làm cách nào tôi có thể khởi tạo một <IList <string>> IList?
- 18. IEnumerable <IEnumerable <T>> để IEnumerable <T> sử dụng LINQ
- 19. Xóa các mục trong một IList <> từ một IList khác <>
- 20. Sự khác nhau giữa IEnumerable và IEnumerable <T>?
- 21. Tại sao ArrayList thực hiện IList, ICollection, IEnumerable?
- 22. Tại sao nên sử dụng IList trên IEnumerable?
- 23. Tại sao IEnumerable <T> không triển khai Add (T)?
- 24. C# Không thể chuyển đổi từ IEnumerable <Base> thành IEnumerable <Derived>
- 25. Làm thế nào để chuyển đổi một IEnumerable <IEnumerable <T>> thành IEnumerable <T>
- 26. Tại sao từ điển <TKey, TValue> không có một trình duyệt <KeyValuePair <TKey, TValue >>?
- 27. Tại sao lớp datetime python có phương thức 'fromtimestamp', nhưng không phải là phương thức 'totimestamp'? lớp <code>datetime</code>
- 28. IEnumerable <string> chuỗi
- 29. Truyền từ IEnumerable <Object> tới IEnumerable <string>
- 30. LoạiError: Object # <IncomingMessage> không có phương thức 'flash'
bạn có thể làm điều đó, nhưng nó có những rủi ro của nó, khi bạn gọi AddRange, bạn có thể mong đợi các đối tượng cơ bản để có một số hiểu biết rằng nó đang hoạt động trên một phạm vi. Trong một kịch bản databinding, điều này có thể sẽ kích hoạt hàng nghìn sự kiện trong một kịch bản mà một sự kiện sẽ là đủ. –
@Sam; thật; nhưng đó là điều tốt nhất bạn có thể thực hiện qua IList; có nhiều cách để bù đắp, tất nhiên ... –
Cảm ơn câu trả lời Marc. Tôi vẫn cảm thấy rằng giao diện nên được thiết kế theo cách mà khả năng sử dụng được cân nhắc nhiều hơn mức dễ triển khai, xem xét việc thêm một danh sách vào danh sách khác là một hoạt động phổ biến. Dù sao, phương pháp mở rộng phục vụ thực sự độc đáo trong trường hợp này, vì vậy nó có thể không phải là bất cứ điều gì để fuss về .. – Kei