Antes do Linq, geralmente usávamos o seguinte método para determinar se uma coleção é não vazia, ou seja, se uma coleção contém elementos:
Usando os atributos Comprimento ou Contagem, não há problema com a escrita acima.
Mas na era Linq, o método de extensão Enumerable.Count "unificava" as propriedades Comprimento e Contagem, resultando na seguinte forma de escrever para julgar a não nulidade:
Essa escrita é boa e funciona bem, mas pode causar problemas de desempenho muito sérios.
Note que é possível, não necessariamente, e se o método acima for passado como um Array<T>, Lista ou <T>Coleção, não haverá problema.
Então, quando algo vai dar errado? Vamos analisar os seguintes métodos:
Quando chamado:
A velocidade de execução será bem lenta, e levou cerca de 70 segundos para meu computador executar a fonte. Contagem() > 0。
Se você analisar, verá que o retorno de rendimento i na linha 5 do código GetNums executa int. MaxValue, é necessário?
Na verdade, desde que retornemos um elemento, podemos concluir que o conjunto é não vazio, e não há necessidade de devolver todos os elementos.
Então, como julgar? Podemos usar o método de extensão Enumerable.Any:
Modifique o método SomeAction da seguinte forma:
Chame de novo e você verá que o tempo de execução é insignificante.
Resumindo, Count() > 0 inevitavelmente terá problemas de desempenho quando encontrar retorno de energia.
|