Compartir a través de


Incremento de la complejidad de OrderBy.First{OrDefault} en LINQ

La implementación de OrderBy.First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) y OrderBy.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) ha cambiado, lo que da lugar a una mayor complejidad para la operación.

Descripción del cambio

Entre las versiones 1.x y 3.x de .NET Core, llamar a OrderBy o OrderByDescending seguido de First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) funciona con complejidad O(N). Puesto que solo se requiere el primer elemento (o predeterminado), solo se requiere una enumeración para encontrarlo. Sin embargo, el predicado que se proporciona a First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) se invoca exactamente N veces, donde N es la longitud de la secuencia.

En .NET 5 y versiones posteriores, se realizó un cambio para que llamar a OrderBy o OrderByDescending seguido de First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) funcione con una complejidad de O(N log N) en lugar de una complejidad de O(N). Sin embargo, el predicado que se proporciona a First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) se puede invocar menos de N veces, lo que es más importante para el rendimiento general.

Nota:

Este cambio coincide con la implementación y la complejidad de la operación en .NET Framework.

Motivo del cambio

La ventaja de invocar el predicado menos veces supera una complejidad general menor, por lo que se revierte la implementación que se introdujo en .NET Core 1.0. Para más información, vea este problema en dotnet/runtime.

Versión introducida

5.0

No se requiere ninguna acción en la parte del desarrollador.

Las APIs afectadas