List.AddRange()
istnieje, ale IList.AddRange()
nie ma.
Wydaje mi się to dziwne. Jaki jest tego powód?
89
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)
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
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 metodyint Bar(String)
, kompilator automatycznie metoda generowaniaint 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:
Repozytorium IListExtension
źródło