Tại sao IList không hỗ trợ AddRange


89

List.AddRange()tồn tại, nhưng IList.AddRange()không.
Điều này làm tôi thấy kỳ quặc. Lý do đằng sau điều này là gì?

Câu trả lời:


68

Bởi vì một giao diện dễ thực hiện và không chứa "mọi thứ ngoại trừ nhà bếp". Nếu bạn thêm, AddRangebạn nên thêm InsertRangeRemoveRange(để đối xứng). Một câu hỏi hay hơn sẽ là tại sao không có các phương thức mở rộng cho IList<T>giao diện tương tự như IEnumerable<T>giao diện. (phương pháp khuyến nông cho tại chỗ Sort, BinarySearch... sẽ có ích)


35
@ShdNx Chúng không quá tầm thường để triển khai hiệu suất khôn ngoan. Một "nội bộ" AddRange/RemoveRange/InsertRangecó thể hoạt động trực tiếp trên bộ sưu tập "nội bộ" và tối ưu hóa việc Capacityquản lý và sử dụng các phương pháp như Array.Copydi chuyển xung quanh các khối dữ liệu. Một phương pháp khuyến nông RemoveRangecó lẽ sẽ là một thứ tự của magniture chậm hơnList.RemoveRange
xanatos

2
Thật tệ là không có (và vẫn không) bất kỳ cách nào để IFookhai báo giao diện (ví dụ ) chỉ định không gian tên "người trợ giúp" (ví dụ MyAssembly) để nếu một lớp yêu cầu thực hiện IFoonhưng thiếu phương thức int Bar(String), trình biên dịch sẽ tự động phương thức tạo int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);} Nếu một tính năng như vậy tồn tại, các giao diện có thể bao gồm nhiều phương thức giống như phương thức AddRangecó thể được triển khai theo hành vi cơ sở, nhưng một số triển khai có thể tối ưu hóa.
supercat

1
Chúng có thể được triển khai dưới dạng các phương thức mở rộng, theo cách đó việc triển khai giao diện sẽ không phải triển khai chúng. Tại sao họ không?
Tom Pažourek

15
Điều này không có ý nghĩa. Một giao diện tóm tắt một triển khai, để có thể có nhiều triển khai của các tính năng cơ bản giống nhau; không có lý do gì tại sao các tính năng lại bị bỏ qua khỏi giao diện, bởi vì "việc triển khai rất khó". Nếu không có các phương thức như "AddRange" trên giao diện, không có gì đảm bảo đối tượng bên dưới hỗ trợ chúng và tại thời điểm đó, bạn buộc phải triển khai một tiện ích mở rộng dưới mức tối ưu hoặc đánh bại mục đích sử dụng giao diện bằng cách đưa ra các giả định nguy hiểm khi cố gắng truyền đến một lớp triển khai cụ thể. Giao diện ngu xuẩn bị sử dụng quá mức.
Triynko

3
Cần có giao diện IRangeList hỗ trợ các hoạt động hàng loạt, chỉ được triển khai trên một số tập hợp nội bộ sẽ có việc triển khai tối ưu.
quá

8

Đối với những người muốn có các phương thức mở rộng cho "AddRange", "Sort", ... trên IList,

Dưới đây là AddRangephương pháp mở rộng:

 public static void AddRange<T>(this IList<T> source, IEnumerable<T> newList)
 {
     if (source == null)
     {
        throw new ArgumentNullException(nameof(source));
     }

     if (newList == null)
     {
        throw new ArgumentNullException(nameof(newList));
     }

     if (source is List<T> concreteList)
     {
        concreteList.AddRange(newList);
        return;
     }

     foreach (var element in newList)
     {
        source.Add(element);
     }
}

Tôi đã tạo một thư viện nhỏ thực hiện điều này. Tôi thấy nó thực tế hơn là phải thực hiện lại các phương pháp mở rộng của nó trên mỗi dự án.

Một số phương pháp chậm hơn List nhưng chúng thực hiện công việc.

Đây là GitHub mà họ quan tâm:

Kho lưu trữ IListExtension

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.