List.AddRange()esiste, ma IList.AddRange()non lo è.
Questo mi sembra strano. Qual è il motivo dietro questo?
List.AddRange()esiste, ma IList.AddRange()non lo è.
Questo mi sembra strano. Qual è il motivo dietro questo?
Risposte:
Perché un'interfaccia deve essere facile da implementare e non contenere "tutto tranne la cucina". Se aggiungi AddRangedevi aggiungere InsertRangee RemoveRange(per simmetria). Una domanda migliore sarebbe perché non ci sono metodi di estensione per l' IList<T>interfaccia simili IEnumerable<T>all'interfaccia. (metodi di estensione per in-place Sort, BinarySearch, ... sarebbe utile)
IFoodichiarazione di interfaccia (ad esempio ) per specificare uno spazio dei nomi "helper" (ad esempio MyAssembly) tale che se una classe dichiara di implementare IFooma manca di metodo int Bar(String), il compilatore si auto- generare metodo int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);} Se una tale caratteristica fosse esistita, le interfacce avrebbero potuto includere più metodi come quelli AddRangeche potrebbero essere implementati in termini di un comportamento di base, ma che alcune implementazioni potrebbero ottimizzare.
Per coloro che desiderano avere metodi di estensione per "AddRange", "Sort", ... su IList,
Di seguito è riportato il AddRangemetodo di estensione:
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);
}
}
Ho creato una piccola libreria che fa questo. Lo trovo più pratico che dover ripetere i suoi metodi di estensione su ogni progetto.
Alcuni metodi sono più lenti di List ma fanno il lavoro.
Ecco il GitHub per interessarli:
AddRange/RemoveRange/InsertRangepuò lavorare direttamente sulla raccolta "interna" e ottimizzare laCapacitygestione e utilizzare metodi comeArray.Copyspostare blocchi di dati. Un metodo di estensioneRemoveRangesarebbe probabilmente un ordine di grandezza più lento diList.RemoveRange