A complexidade de OrderBy.First{OrDefault} do LINQ aumentou
A implementação de OrderBy.
First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) e OrderBy.
FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) foi alterada, resultando em operação com maior complexidade.
Descrição das alterações
No .NET Core 1.x - 3.x, chamar OrderBy ou OrderByDescending seguido por First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) ou FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) operará com complexidade O(N)
. Como somente o primeiro elemento (ou padrão) é necessário, apenas uma enumeração é exigida para localizá-lo. No entanto, o predicado fornecido para First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) ou FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) é invocado exatamente N
vezes, em que N
é o comprimento da sequência.
No .NET 5 e versões posteriores, uma alteração foi feita de forma que chamar OrderBy ou OrderByDescending seguido por First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) ou FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) operará com O(N log N)
complexidade O(N)
. No entanto, o predicado fornecido para First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) ou FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) pode ser invocado menos de N
vezes, que é mais importante para o desempenho geral.
Observação
Essa alteração corresponde à implementação e à complexidade da operação no .NET Framework.
Motivo da alteração
O benefício de invocar o predicado menos vezes supera uma complexidade geral menor, portanto, a implementação que foi introduzida no .NET Core 1.0 foi revertida. Para mais informações, consulte este problema dotnet/runtime.
Versão introduzida
5,0
Ação recomendada
Nenhuma ação é necessária por parte do desenvolvedor.