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, AddRange
deve adicionar InsertRange
e 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)
IFoo
declaração de interface (por exemplo ) especificar um namespace "auxiliar" (por exemplo MyAssembly
) de forma que se uma classe solicitar a implementação, IFoo
mas 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 AddRange
que 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 AddRange
mé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/InsertRange
pode trabalhar diretamente na coleção "interna" e otimizar oCapacity
gerenciamento e usar métodos comoArray.Copy
mover blocos de dados. Um método de extensãoRemoveRange
provavelmente seria uma ordem de magnitude mais lenta queList.RemoveRange