List.AddRange()existe, mas IList.AddRange()não.
Isso me parece estranho. Qual é a razão por trás disso?
List.AddRange()existe, mas IList.AddRange()não.
Isso me parece estranho. Qual é a razão por trás disso?
Respostas:
Porque uma interface deve ser fácil de implementar e não conter "tudo menos a cozinha". Se você adicionar, AddRangedeve adicionar InsertRangee RemoveRange(para simetria). Uma pergunta melhor seria por que não existem métodos de extensão para a IList<T>interface semelhantes à IEnumerable<T>interface. (métodos de extensão para in-place Sort, BinarySearch... seria útil)
IFoodeclaração de interface (por exemplo ) especificar um namespace "auxiliar" (por exemplo MyAssembly) de forma que se uma classe solicitar a implementação, IFoomas não tiver método int Bar(String), o compilador se auto- método de geração int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);} Se tal recurso existisse, as interfaces poderiam ter incluído mais métodos, como os AddRangeque poderiam ser implementados em termos de comportamento de base, mas que algumas implementações poderiam otimizar.
Para aqueles que desejam ter métodos de extensão para "AddRange", "Sort", ... em IList,
Abaixo está o AddRangemétodo de extensão:
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);
}
}
Criei uma pequena biblioteca que faz isso. Acho mais prático do que ter que refazer seus métodos de extensão em cada projeto.
Alguns métodos são mais lentos que List, mas fazem o trabalho.
Aqui está o GitHub para interessá-los:
AddRange/RemoveRange/InsertRangepode trabalhar diretamente na coleção "interna" e otimizar oCapacitygerenciamento e usar métodos comoArray.Copymover blocos de dados. Um método de extensãoRemoveRangeprovavelmente seria uma ordem de magnitude mais lenta queList.RemoveRange