Obviamente, há uma diferença no desempenho, .Where()
resultando em uma chamada de delegado para cada item. No entanto, eu não me preocuparia com o desempenho:
Os ciclos de relógio usados na chamada de um delegado são insignificantes em comparação com os ciclos de relógio usados pelo restante do código que itera sobre a coleção e verifica as condições.
A penalidade de desempenho de chamar um delegado é da ordem de alguns ciclos de relógio e, felizmente, já passamos dos dias em que precisávamos nos preocupar com ciclos de relógio individuais.
Se, por algum motivo, o desempenho for realmente importante para você no nível do ciclo do relógio, use em List<Item>
vez de IList<Item>
, para que o compilador possa fazer uso de chamadas diretas (e inlináveis) em vez de chamadas virtuais e para que o iterador de List<T>
, na verdade, seja a struct
, não precisa ser encaixotado. Mas isso é realmente insignificante.
Uma consulta ao banco de dados é uma situação diferente, porque existe (pelo menos em teoria) a possibilidade de enviar o filtro para o RDBMS, melhorando consideravelmente o desempenho: somente as linhas correspondentes farão a viagem do RDBMS para o seu programa. Mas, para isso, acho que você precisaria usar o linq, não acho que essa expressão possa ser enviada ao RDBMS como está.
Você realmente verá os benefícios do if(x) continue;
momento em que precisa depurar esse código: Passar por cima de if()
s e continue
s funciona muito bem; entrar no delegado de filtragem é uma dor.