2009-07-12 41 views
23

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>?

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); 
+7

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à đủ. –

+0

@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 ... –

+1

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

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