La complessità di LINQ OrderBy.First{OrDefault} è stata aumentata

L'implementazione di OrderBy.First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) e OrderBy.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) è cambiata, con conseguente maggiore complessità per l'operazione.

Descrizione delle modifiche

In .NET Core 1.x - 3.x, chiamando OrderBy o OrderByDescending seguito da First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) si opera con complessità O(N). Poiché è necessario solo il primo elemento (o predefinito), è necessaria una sola enumerazione per individuarlo. Tuttavia, il predicato fornito a First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) viene richiamato esattamente N volte, dove N è la lunghezza della sequenza.

In .NET 5 e versioni successive, è stata apportata una modifica in modo che la chiamata OrderBy o OrderByDescending seguita da First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) opera con funzioni di complessità O(N log N) anziché con complessità O(N). Tuttavia, il predicato fornito a First<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) o FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) può essere richiamato meno di N volte, che è più importante per le prestazioni complessive.

Nota

Questa modifica corrisponde all'implementazione e alla complessità dell'operazione in .NET Framework.

Motivo della modifica

Il vantaggio di richiamare il predicato meno volte supera una complessità complessiva inferiore, quindi l'implementazione introdotta in .NET Core 1.0 è stata ripristinata. Per altre informazioni, vedere questo problema di dotnet/runtime.

Versione di introduzione

5.0

Non occorre alcuna azione da parte dello sviluppatore.

API interessate