List.AddRange()
istnieje, ale IList.AddRange()
nie ma.
Wydaje mi się to dziwne. Jaki jest tego powód?
List.AddRange()
istnieje, ale IList.AddRange()
nie ma.
Wydaje mi się to dziwne. Jaki jest tego powód?
Odpowiedzi:
Ponieważ interfejs powinien być łatwy w implementacji i nie zawierać „wszystkiego oprócz kuchni”. Jeśli dodasz AddRange
, powinieneś dodać InsertRange
i RemoveRange
(dla symetrii). Lepszym pytaniem byłoby, dlaczego nie ma metod rozszerzających IList<T>
interfejsu podobnych do IEnumerable<T>
interfejsu. (metody szkoleniowe dla in-place Sort
, BinarySearch
... byłoby przydatne)
IFoo
deklaracja interfejsu (np. ), Aby określić przestrzeń nazw „pomocnika” (np. MyAssembly
) W taki sposób, że jeśli klasa twierdzi, że jest zaimplementowana, IFoo
ale nie ma metody int Bar(String)
, kompilator automatycznie metoda generowania int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);}
Gdyby taka funkcja istniała, interfejsy mogłyby zawierać więcej metod, takich jak te, AddRange
które mogłyby zostać zaimplementowane w zakresie zachowania podstawowego, ale które niektóre implementacje mogłyby zoptymalizować.
Dla tych, którzy chcą mieć metody rozszerzające dla „AddRange”, „Sort”, ... na IList,
Poniżej znajduje się AddRange
metoda rozszerzenia:
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);
}
}
Stworzyłem małą bibliotekę, która to robi. Uważam, że jest to bardziej praktyczne niż konieczność ponownego modyfikowania metod rozszerzania w każdym projekcie.
Niektóre metody są wolniejsze niż lista, ale spełniają swoje zadanie.
Oto GitHub, który ich zainteresuje:
AddRange/RemoveRange/InsertRange
może pracować bezpośrednio na „wewnętrznym” zbiorze i optymalizowaćCapacity
zarządzanie oraz wykorzystywać takie metody, jakArray.Copy
poruszanie się po blokach danych. Metoda przedłużeniaRemoveRange
byłaby prawdopodobnie o rząd wielkości wolniejsza niżList.RemoveRange