List.AddRange()існує, але IList.AddRange()не існує .
Це здається мені дивним. У чому причина цього?
List.AddRange()існує, але IList.AddRange()не існує .
Це здається мені дивним. У чому причина цього?
Відповіді:
Оскільки інтерфейс повинен бути простим у реалізації та не містити "всього, крім кухні". Якщо ви додаєте, AddRangeто слід додати InsertRangeі RemoveRange(для симетрії). Кращим запитанням було б, чому для IList<T>інтерфейсу не існує методів розширення, подібних до IEnumerable<T>інтерфейсу. (Методи розширення для на місці Sort, BinarySearch... було б корисно)
IFoo) вказати простір імен "допоміжний" (наприклад MyAssembly), щоб, якщо клас вимагає реалізації, IFooале бракує методу int Bar(String), компілятор автоматично генерувати метод int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);} Якби така функція існувала, інтерфейси могли б включати більше методів, таких як AddRangeякі можна було б реалізувати з точки зору базової поведінки, але які деякі реалізації могли б оптимізувати.
Для тих, хто хоче мати методи розширення для "AddRange", "Sort", ... на IList,
Нижче наведено AddRangeметод розширення:
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);
}
}
Я створив невелику бібліотеку, яка цим займається. Я вважаю це більш практичним, ніж необхідність переробляти методи розширення для кожного проекту.
Деякі методи повільніші за List, але вони роблять свою роботу.
Ось GitHub, щоб зацікавити їх:
AddRange/RemoveRange/InsertRangeможе працювати безпосередньо над "внутрішньою" колекцією та оптимізуватиCapacityуправління та використовувати такі методи, якArray.Copyпереміщення по блоках даних. Метод розширенняRemoveRange, мабуть, був би на порядок меншим, ніж повільно, ніжList.RemoveRange