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ì?
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:
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, AddRange
bạn nên thêm InsertRange
và RemoveRange
(để đố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)
IFoo
khai 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 IFoo
như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 AddRange
có 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.
Đố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à AddRange
phươ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:
AddRange/RemoveRange/InsertRange
có 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ệcCapacity
quản lý và sử dụng các phương pháp nhưArray.Copy
di chuyển xung quanh các khối dữ liệu. Một phương pháp khuyến nôngRemoveRange
có lẽ sẽ là một thứ tự của magniture chậm hơnList.RemoveRange