List.AddRange()
existe, mas IList.AddRange()
não.
Isso me parece estranho. Qual é a razão por trás disso?
88
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)
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
IFoo
declaração de interface (por exemplo ) especificar um namespace "auxiliar" (por exemploMyAssembly
) de forma que se uma classe solicitar a implementação,IFoo
mas não tiver métodoint Bar(String)
, o compilador se auto- método de geraçãoint 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 osAddRange
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: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:
Repositório IListExtension
fonte