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