List.AddRange()
existe, pero IList.AddRange()
no lo hace.
Esto me parece extraño. ¿Cuál es la razón detrás de esto?
List.AddRange()
existe, pero IList.AddRange()
no lo hace.
Esto me parece extraño. ¿Cuál es la razón detrás de esto?
Respuestas:
Porque una interfaz debe ser fácil de implementar y no contener "todo menos la cocina". Si agrega AddRange
, debe agregar InsertRange
y 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)
IFoo
declaración de interfaz (p . Ej. ) Especifique un espacio de nombres "auxiliar" (p MyAssembly
. Ej. ) Tal que si una clase afirma implementar IFoo
pero carece de método int Bar(String)
, el compilador generar método int 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 los AddRange
que 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 AddRange
mé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:
AddRange/RemoveRange/InsertRange
puede trabajar directamente en la colección "interna" y optimizar laCapacity
gestión y utilizar métodos comoArray.Copy
mover bloques de datos. Un método de extensiónRemoveRange
probablemente sería un orden de aumento más lento queList.RemoveRange