Optimize o LINQ para IList
á um tempo atrás escrevi umIList
método de extensão para enumerar parte de uma lista usando os índices. Durante a refatoração, percebi que uma consulta semelhante poderia ser realizada chamandoSkip(toSkip).Take(amount)
. Enquanto comparava isso, notei queSkip
não está otimizado paraIList
. Com um pouco de pesquisa, acabei no post de Jon Skeet,discussing por que otimizar métodos comoSkip
é perigos.
Pelo que entendi o artigo, o problema não é exceção nos métodos otimizados quando a coleção é modificada, mas, como um comentário afirma, a documentação do msdn entra em conflit
Se forem feitas alterações na coleção, como adicionar, modificar ou excluir elementos, o enumerador é irrecuperavelmente invalidado e a próxima chamada para MoveNext ou Reset lança uma InvalidOperationException.
Em IEnumerator.GetEnumerator ():
Se forem feitas alterações na coleção, como adicionar, modificar ou excluir elementos, o enumerador é irrecuperavelmente invalidado e seu comportamento é indefinido.
Vejo mérito em ambas as convenções e estou um pouco perdido ao otimizar ou não. O que é uma solução adequada? Eu estive pensando em umIList.AssumeImmutable()
abordagem ao longo das linhas deAsParallel()
como mencionado por Kris Vandermotten nos comentários. Já existe alguma implementação ou é uma má ideia?