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

Nenhuma ação é necessária por parte do desenvolvedor.

APIs afetadas