List.AddRange()existe, pero IList.AddRange()no lo hace.
Esto me parece extraño. ¿Cuál es la razón detrás de esto?
89
Porque una interfaz debe ser fácil de implementar y no contener "todo menos la cocina". Si agrega AddRange, debe agregar InsertRangey RemoveRange(por simetría). Una mejor pregunta sería por qué no existen métodos de extensión para la IList<T>interfaz similares a la IEnumerable<T>interfaz. (métodos de extensión para en el lugar Sort, BinarySearch... sería útil)
AddRange/RemoveRange/InsertRangepuede trabajar directamente en la colección "interna" y optimizar laCapacitygestión y utilizar métodos comoArray.Copymover bloques de datos. Un método de extensiónRemoveRangeprobablemente sería un orden de aumento más lento queList.RemoveRangeIFoodeclaración de interfaz (p . Ej. ) Especifique un espacio de nombres "auxiliar" (pMyAssembly. Ej. ) Tal que si una clase afirma implementarIFoopero carece de métodoint Bar(String), el compilador generar métodoint IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);}Si existiera tal característica, las interfaces podrían haber incluido más métodos como losAddRangeque podrían implementarse en términos de un comportamiento base, pero que algunas implementaciones podrían optimizar.Para aquellos que quieran tener métodos de extensión para "AddRange", "Sort", ... en IList,
A continuación se muestra el
AddRangemétodo de extensión: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); } }Creé una pequeña biblioteca que hace esto. Lo encuentro más práctico que tener que rehacer sus métodos de extensión en cada proyecto.
Algunos métodos son más lentos que List, pero funcionan.
Aquí está el GitHub para interesarlos:
Repositorio de IListExtension
fuente