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 AddRange
devi aggiungere InsertRange
e 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)
IFoo
dichiarazione di interfaccia (ad esempio ) per specificare uno spazio dei nomi "helper" (ad esempio MyAssembly
) tale che se una classe dichiara di implementare IFoo
ma 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 AddRange
che 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 AddRange
metodo 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/InsertRange
può lavorare direttamente sulla raccolta "interna" e ottimizzare laCapacity
gestione e utilizzare metodi comeArray.Copy
spostare blocchi di dati. Un metodo di estensioneRemoveRange
sarebbe probabilmente un ordine di grandezza più lento diList.RemoveRange